【问题标题】:Why delegate is not calling on navigationController为什么委托不调用navigationController
【发布时间】:2012-08-05 19:27:05
【问题描述】:

我知道如何使用委托模式

  1. 声明协议
  2. 必需或可选方法
  3. id<> delegate财产
  4. [delegate respondtoselector:@selector(method)]
  5. 继承class <someProtocol>中的协议
  6. -(void) protolcolMethod
  7. class1Obj.delegate = self;

我在我的应用程序中使用了这几个地方,但现在我在同一个应用程序中再次执行此操作,响应选择器不起作用。唯一的区别是这次它在 NavController 中。

NavController 父 tableview 类 didselectrow,推送另一个视图,该视图具有调用 presentmadelcontroller 的按钮,这是我声明我的协议并在 navigationContoller 父类中继承的地方。 但为什么它不起作用?我为此苦苦挣扎了几个小时。

此类以模态方式呈现并声明此协议

#import <CoreData/CoreData.h>

@protocol xPro <NSObject>
-(void)xGet;
@end

id<xPro> xDel;

@interface rosterForGroup : UIViewController <NSFetchedResultsControllerDelegate>
{
    NSFetchedResultsController *fetchedResultsController;
    NSArray *dispName;
}

@property (strong, nonatomic) IBOutlet UITableView *tableView;

@property (strong, nonatomic) id<xPro> xDel; 

- (IBAction)xFunc:(id)sender;

@end


.m file ...
- (IBAction)xFunc:(id)sender
{
    [xDel xGet];
}

而这个类是NavController的父类

    ...
    @interface groupChatViewController : UIViewController<XMPPRoomDelegate, createNewGroupDelegate, UITableViewDataSource, UITableViewDelegate, xPro>
    ...
    @property (strong, nonatomic) rosterForGroup *xR4G;
    ...


- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view from its nib.

    xR4G = [[rosterForGroup alloc]init];
    xR4G.xDel = self;
...

-(void)xGet
{
    NSLog(@"AAAAAAH");
}

请避免使用这些奇怪的对象名称。

rosterforgroup alloc/init

- (IBAction)openGroupOptions:(id)sender
{
     roster4Group = [[rosterForGroup alloc]init];
     [roster4Group setDelegate:self];
     [self presentModalViewController:roster4Group animated:true];
     //[xmppRoom fetchMembersList]; 
}

【问题讨论】:

  • 那里应该有问题吗?
  • 调用 [xDel xGet]; 时 xDel 的值是多少?
  • @PhillipMills 抱歉,我没有收到您的问题。
  • 你的委托变量id&lt;xPro&gt; xDel; 只是漂浮在那里。那不应该是一个ivar吗?
  • 是 rosterForGroup 布局在故事板还是 xib 文件中?

标签: objective-c ios


【解决方案1】:

也许这是一个远景;但我怀疑实际上“在屏幕上”的 rosterForGroup 与您在 viewDidLoad 方法中 alloc/initing 的实例不相同。也许您是通过 segues 或其他方法到达那里的;但是您显示的代码并未表明(尽管它可能在您省略的代码中)您实际上正在将 xR4G 视图控制器设置为 contained 视图控制器并将其放在屏幕上(连接后它的动作方法等。

这意味着解决方案是对您的 View Controller 关系进行轻微重组,如果您不清楚如何完成该问题,这可能值得提出一个额外的 SO 问题(这个问题,就目前而言,是不正确的就如何获得你想要的东西提供建议的地方)。

编辑

我还怀疑您的 rosterForGroup 视图控制器未正确初始化。简单地在 VC 上执行 alloc/init 将无法正确设置其视图及其 IB* 连接(除非它是 loadView 方法以编程方式完成所有操作)。它们应该从您的故事板或 XIB 文件中加载(initWithNibName: 或 [self.storyboard instantiateViewControllerWithIdentifier:]

【讨论】:

  • 感谢回复.. 给我 5 分钟让我粘贴分配初始化代码
  • - (IBAction)openGroupOptions:(id)sender { roster4Group = [[rosterForGroup alloc]init]; [roster4Group setDelegate:self]; [self presentModalViewController:roster4Group animated:true]; //[xmppRoom fetchMembersList]; }
  • rosterforgroup 只有 initwithnibname 没有其他 init 方法。
  • 啊,请用它编辑您的原始问题!这是很好的细节:-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-10-05
  • 1970-01-01
  • 1970-01-01
  • 2014-04-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多