委托方法协议不起作用 - 目标C.

kam*_*hai 2 iphone xcode objective-c ipad ios

我正在splitView为我的申请工作iPad.我已经实现了一个UIButton名为Upload.点击它,a UITableView出现在UIPoverController.在点击任何内容,我想,以显示我的一些各自的网站UIwebViewUIDetailView.为此,我实施了一个delegate method protocol.我在UploadTableViewController.h文件中使用了以下代码行::

@protocol UploadTableViewDelegate <NSObject>
@required
- (void)selected:(NSString *)his;
@end


 @interface UploadSpaceTableViewController : UITableViewController{
id<UploadSpaceTableViewDelegate> delegate;
}

@property (retain) id delegate;
@end
Run Code Online (Sandbox Code Playgroud)

在相应的.m文件中,我使用了以下代码行::

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{

if (delegate != nil) {
    NSString *hisSelected = [keys objectAtIndex:indexPath.row];
    NSLog(@"%@ lolwa", hisSelected);
    [delegate selected:hisSelected];
}

}
Run Code Online (Sandbox Code Playgroud)

.m我实现该函数的类文件中Selected,代码是::

- (void)selected:(NSString *)Key {    
  NSLog(@"hello");    
  [self.UploadSpaceTableViewPopover dismissPopoverAnimated:YES];
}


-(IBAction)uploadpressed:(id)sender{  
Upload.delegate = self;
self.Upload = [[UploadSpaceTableViewController alloc] 
                         initWithStyle:UITableViewStylePlain];
self.UploadTableViewPopover = [[UIPopoverController alloc] 
                                initWithContentViewController:UploadSpace];               

[self.UploadTableViewPopover presentPopoverFromBarButtonItem:sender 
                                permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];
 }
Run Code Online (Sandbox Code Playgroud)

但是,我无法在gdb中获取hello(在函数中编写Selected)NSLogged.这是我第一次使用它delegate method protocol.我无法解决这个问题.有人可以帮我吗 ?感谢致敬.

Cod*_*aFi 5

[delegate keySelected:hisKeySelected];是你的第一个问题.您没有声明一个名为的委托方法-keySelected:,您声明了一个名为的委托方法-Selected:.

您的第二个问题是您绝对不是表视图的委托.为了-didSelectRowAtIndexPath:调用委托方法,您必须是表的委托.

PS,不要用大写字母开始实例或方法名称.在ObjC中,大写字母表示一个类.

编辑:这是你的UploadSpaceTableViewController标题应该是这样的:

@protocol UploadTableViewDelegate <NSObject>
@required
- (void)selected:(NSString *)his;
@end

@interface UploadSpaceTableViewController : UITableViewController<UITableViewDataSource, UITableViewDelegate>
@property (nonatomic, assign) id <UploadSpaceTableViewDelegate>delegate; //delegates are weak!!!
@end
Run Code Online (Sandbox Code Playgroud)

而.m,我会跳过很多不必要的东西:

-(void)viewDidLoad {
    [self.tableView setDelegate:self];
    [self.tableView setDataSource:self];
}
//other code
Run Code Online (Sandbox Code Playgroud)

此外,您的代表被宣布为保留,这是ObjC中的绝对否定.如果使用ARC,则声明为弱,如果不使用则声明为.

-uploadPressed:通过在显式拥有或初始化对象之前设置它,您还可以在方法中生成nil委托.这是它应该看起来的样子:

self.Upload = [[UploadSpaceTableViewController alloc]initWithStyle:UITableViewStylePlain];
Upload.delegate = self;
Run Code Online (Sandbox Code Playgroud)