iOS奇怪的委托行为?

时间:2013-08-30 09:26:56

标签: iphone ios objective-c uiviewcontroller delegates

我在iOS中有一个非常奇怪的委托行为。我在子类UIViewController中设置一个自定义委托,如下所示:

- (void)viewDidLoad
{
    [super viewDidLoad];
    self.baseNavigationBar = [[BaseNavigationBar alloc] initWithNibName:nil bundle:nil];
    self.baseNavigationBar.delegate = self;
    self.baseNavigationBar.navigationController = self.navigationController;
    [self.navigationController.navigationBar addSubview:self.baseNavigationBar];
}

当使用默认的nib时,initWithNibName可以使用nil,因为在内部它会检查nibName中的nil。

if (!nibNameOrNil) {
    nibNameOrNil = NSStringFromClass([self class]);
}

baseNavigationBar对象的委托声明如下所示:

@property (nonatomic, retain) id<BaseNavigationBarDelegate> delegate;
/*same thing with assign, which I you should use*/
/*and in the .m of course @synthesize*/

现在正在运行的应用程序中有2个截图。

第一个显示来自 BaseListViewController 的调试器值,它是 BaseCoreViewController 的子类,它是 UIViewController 的子类。 / p>

调用viewDidLoad方法时会截屏。

List Controller

第二个显示来自 BaseNavigationBar 的值,这是一个 UIView 子类。

当用户点击“下一步”按钮时,屏幕截图一次拍摄

- (IBAction)nextAction:(id)sender {
    if (self.delegate) {
        [self.delegate navigationBarDidClickNextButton:self];
    }
}

NavigationBar

那为什么这是一个问题呢?通过单击 BaseNavigationBar 中的按钮,我的委托总是为零,因此程序被卡住了。但是当同时查看 BaseCoreViewController 中的值时,委托不是nil。很奇怪。

修改

使用UINib loadNibNamed:owner:options:function从nib文件加载BaseNavigationBar。

修改2

所以这几乎都是代码。

编辑3

最后,我们在代码的最后部分得到了错误的来源...设置self =完全不允许的内容......

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {

    if (!nibNameOrNil) {
        nibNameOrNil = NSStringFromClass([self class]);
    }

    if (!nibBundleOrNil) {
        nibBundleOrNil = [NSBundle mainBundle];
    }

    NSArray *topLevelObjects = [nibBundleOrNil loadNibNamed:nibNameOrNil owner:self options:nil];
    /*Here is the bad part*/
    self = [topLevelObjects objectAtIndex:0];

    state = BaseNavigationBarButtonStateNext;

    if (self) {
        self.title = @"";
    }
    return self;
}

使用Class方法解决,而不是定义自定义init。

2 个答案:

答案 0 :(得分:2)

如果您正在使用nib文件,则应在初始化类对象时声明nib类。

您已初始化initWithNibName:nil

self.baseNavigationBar = [[BaseNavigationBar alloc] initWithNibName:nil bundle:nil];

但它应该像initWithNibName:@"BaseNavigationBar"

self.baseNavigationBar = [[BaseNavigationBar alloc] initWithNibName:@"BaseNavigationBar" bundle:nil]; 

答案 1 :(得分:1)

不确定问题是什么。需要更多代码来分析问题。但我能看到的是两个屏幕截图中BaseNavigationBar的地址不同。这意味着控制器中存在的BaseNavigationBar对象不是第二次屏幕截图中获取nextAction事件的对象。