为什么委托不调用navigationController

时间:2012-08-05 19:27:05

标签: objective-c ios

我知道如何使用委托模式

  1. 声明协议
  2. 必需或可选方法
  3. id<> delegate property
  4. [delegate respondtoselector:@selector(method)]
  5. 继承class <someProtocol>
  6. 中的协议
  7. -(void) protolcolMethod
  8. class1Obj.delegate = self;
  9. 我在我的应用程序中使用了这几个地方,但现在我在同一个应用程序中再次执行此操作responsetoselector无效。唯一的区别是这次它在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]; 
    }
    

1 个答案:

答案 0 :(得分:0)

也许这是一个长镜头;但我怀疑实际上“在屏幕上”的rosterForGroup是而不是你在viewDidLoad方法中alloc/init的同一个实例。也许你是通过segues或其他方法到达那里的;但是您显示的代码并未指出(尽管可能在您省略的代码中)您实际上将xR4G视图控制器设置为包含 View Controller并将其放在屏幕上(连接后)这是行动方法等。

这意味着该解决方案是对View Controller关系的轻微重构,如果您不清楚如何实现这一点,则可能需要额外的SO问题(这个问题,因为它代表了,不是正确的建议如何得到你想要的东西。

修改

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