初始化UIViewController时如何传递参数?

时间:2011-04-30 15:10:47

标签: objective-c uiviewcontroller

我有两个控制器,First- and SecondViewController。我想分享FirstViewController的一些方法,以便在我的SecondViewController中使用它们。

这是我在FirstViewController中创建SecondViewController的方法:

sms = [[SecondViewController alloc] init];
UINavigationController *navController = [[UINavigationController alloc]
                                             initWithRootViewController:sms];

[self presentModalViewController:navController animated:YES];

我想过将FirstViewController的当前实例传递给扩展UIViewController的SecondViewController。默认情况下,调用SecondViewController的initWithNibName方法。

我如何在objective-c中实现这一目标?

2 个答案:

答案 0 :(得分:3)

我不完全确定我理解这个问题......因为问题的一部分与你如何实例化SecondViewController ...发布代码可以帮助。

但要回答你的问题,因为你问过它......“如何将FirstViewController传递给SecondViewController”......

在你的SecondViewController.h中

创建自己的init方法

-(id) initWithFirstViewController:(UIViewController *)theFirstViewController;

并在.m文件中...

-(id) initWithFirstViewController:(UIViewController *)theFirstViewController
{
  self = [super initWithNibName:@"myNibName" bundle:nil];

 self.firstViewController = theFirstViewController; //this assumes you have created this property.  Also, do NOT retain the first view controller or you will get circular reference and will secondviewcontroller will leak.



return self;

}

然后..这里是关键..确保你调用正确的init方法来实例化SecondViewContoller

SecondViewController *svc = [[SecondViewController alloc]initWithFirstViewController:self];

现在......说过......看看你的SO评级,我有一种感觉你已经知道了......真正的问题可能是......为什么当你没有明确地调用它时会调用initWithNibName ?

答案 1 :(得分:1)

不是100%肯定你在追求什么。关于共享方法的问题的内容似乎与在init中传入参数的问题不匹配。

关于方法,您可以从parentViewController

调用方法
if ([self.parentViewController respondsToSelector:@selector(someMethod)]) {
    [self.parentViewController someMethod];
}

如果要在init的任何类中传递参数,您将需要使用所需的任何其他参数编写自定义init方法。该自定义方法应以适当的[self init]调用开始。您甚至可以使用多种自定义init方法。

以下是下载json或xml feed的类的示例。

- (id)initWithID:(NSString *)useID delegate:(id)setDelegate urlString:(NSString *)urlString feedIsJSON:(BOOL)feedIsJSON failedRetrySecondsOrNegative:(float)failedRetrySecondsOrNegative refreshSecondsOrNegative:(float)refreshSecondsOrNegative {

    if ((self = [super init])) {
        // Custom initialization        
        processing = NO;
        self.delegate = setDelegate;

        self.feedID = [NSString stringWithFormat:@"%@", useID];
        self.feedURLString = [NSString stringWithFormat:@"%@", urlString];
        self.isJSON = feedIsJSON;

        if (failedRetrySecondsOrNegative>=0.0f) {
            retryFailedSeconds = failedRetrySecondsOrNegative;
        } else {
            retryFailedSeconds = kFailedRefresh;
        }

        if (refreshSecondsOrNegative>=0.0f) {
            refreshSeconds = refreshSecondsOrNegative;
        } else {
            refreshSeconds = kSuccededRefresh;
        }

    }
    return self;
}

希望这有帮助。