0

我在课堂上有这种方法。我如何在我的子类(这个类)中使用它,因为当我调用 [self shiftViewUpForKeyboard]; 它需要参数,但是当我键入 theNotification 时,它会给出错误。我知道这可能是非常基本的,但它确实会在我的整个应用程序中帮助我很多。

- (void) shiftViewUpForKeyboard: (NSNotification*) theNotification;
{


    CGRect keyboardFrame;
    NSDictionary* userInfo = theNotification.userInfo;
    keyboardSlideDuration = [[userInfo objectForKey: UIKeyboardAnimationDurationUserInfoKey] floatValue];
    keyboardFrame = [[userInfo objectForKey: UIKeyboardFrameBeginUserInfoKey] CGRectValue];

    UIInterfaceOrientation theStatusBarOrientation = [[UIApplication sharedApplication] statusBarOrientation];

    if UIInterfaceOrientationIsLandscape(theStatusBarOrientation)
        keyboardShiftAmount = keyboardFrame.size.width;
    else 
        keyboardShiftAmount = keyboardFrame.size.height;

    [UIView beginAnimations: @"ShiftUp" context: nil];
    [UIView setAnimationDuration: keyboardSlideDuration];
    self.view.center = CGPointMake( self.view.center.x, self.view.center.y - keyboardShiftAmount);
    [UIView commitAnimations];
    viewShiftedForKeyboard = TRUE;

}

非常感谢你!

4

1 回答 1

3

这看起来像一个通知处理程序。您通常不应该自己调用通知处理程序。通知处理程序方法通常由NSNotificationCenter. 通知中心向NSNotification处理程序方法发送一个对象。在您的情况下,通知包括一些额外的用户信息。

您可能类似于代码中的用户信息字典,它应该直接调用处理程序并将其传递给处理程序方法(NSNotification使用所需的用户信息字典构建您自己的对象)。但是,这很容易出错,我认为这是一种“黑客行为”。

我建议您将代码放入不同的方法中,从您的问题的通知处理程序中调用该方法,然后使用不同的方法进行直接调用。

然后,您将拥有:

- (void) shiftViewUpForKeyboard: (NSNotification*) theNotification;
{
    NSDictionary* userInfo = theNotification.userInfo;
    keyboardSlideDuration = [[userInfo objectForKey: UIKeyboardAnimationDurationUserInfoKey] floatValue];
    keyboardFrame = [[userInfo objectForKey: UIKeyboardFrameBeginUserInfoKey] CGRectValue];
    [self doSomethingWithSlideDuration:keyboardSlideDuration frame:keyboardFrame];
}

将该doSomethingWithSlideDuration:frame:方法实现为类的实例方法。在直接调用它的代码中,调用doSomethingWithSlideDuration:frame而不是调用通知处理程序。

直接调用方法时需要自己传递幻灯片时长和帧数。

于 2012-04-28T08:02:18.433 回答