0

我知道如何使用委托模式

  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]; 
}
4

1 回答 1

0

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

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

编辑

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

于 2012-08-05T20:04:38.937 回答