0

好的,真正的快速问题,如果我想在一个方法中传递一个视图控制器,这将是正确的方法(显然,两者似乎都有效) -

-(void)fetchedDataN:(UIViewController *)response

或者

-(void)fetchedDataN:(ViewController *)response

编辑:这是澄清事情的完整代码

- (IBAction)nextButton:(id)sender {


 activityN.hidden=NO;
[activityN startAnimating];
[self.view bringSubviewToFront:activityN];

[audioFile stop];
NSLog(@"HELL O");

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
   Page04ViewController *viewControl=[[Page04ViewController alloc]initWithNibName:nil bundle:nil]; 

    [self performSelectorOnMainThread:@selector(fetchedDataN:)
                           withObject:viewControl waitUntilDone:YES];
}); }



-(void)fetchedDataN:(UIViewController *)response{


if ([self interfaceOrientation] == UIDeviceOrientationLandscapeLeft) {

    [self presentViewController:response withPushDirection:@"fromTop"];

    //        NSLog(@"landscape left");
}

else if([self interfaceOrientation] == UIDeviceOrientationLandscapeRight)
{
    [self presentViewController:response withPushDirection:@"fromBottom"];

    //    NSLog(@"landscape right");
} }
4

4 回答 4

2

大概ViewControllerUIViewController...的一个子类

如果您尝试将 a 传递UIViewController给第二种方法,那将不起作用(编译器会抱怨),因为它不能保证您传递的实例是正确的类。

如果您尝试传递ViewController给第一个可行的方法,因为编译器可以做出保证。

方法定义的正确性取决于您的意图 - 不知道,两者都不正确,它们只是不同......


对于您更新的问题,如果该方法仅呈现视图控制器,则UIViewController可以认为使用是正确的,因为它是最通用和最灵活的选项。如果您以后想更改该方法以添加需要response成为特定子类的其他功能,那么编译器会告诉您它不能保证该类的类型是正确的。

于 2013-07-30T11:38:35.453 回答
0

这是对的: -(void)fetchedDataN:(UIViewController *)response

那么你就可以

-(void)fetchedDataN:(UIViewController *)response
{
    if ([controller isKindOfClass:[ViewControllerSubclass class]])
    {
        //The controller is a ViewControllerSubclass or a subclass of ViewControllerSubclass your code here
    }
    if ([controller isKindOfClass:[MyViewControllerSubclass class]])
    {
        //The controller is a MyViewControllerSubclass or a subclass of MyViewControllerSubclass your code here
    }
}
于 2013-07-30T11:37:33.220 回答
0

这取决于您是否只想传递ViewController和/或其后代或UIViewController所有后代。UIViewController将是更通用的方式,因为(我假设)ViewController是子类,UIViewController并且您可能不再扩展ViewController。一切都取决于上下文,如果您需要使用定义的任何特定方法/属性,ViewController或者您只想接收任何视图控制器子类化UIViewController

于 2013-07-30T11:38:17.623 回答
0

如果你想传递一个 UIViewController;使用第一种方法。我从未听说过“ViewController”类型。它是你自己的类型吗?如果您总是想确保传递的变量是“ViewController”类型,请使用第二种方法。

于 2013-07-30T11:38:39.907 回答