2012-06-28 61 views
2

我正在为我的iPadsplitView应用程序工作。我实施了UIButton,名为Upload。点击它,UITableView出现在UIPoverController内。在点击任何内容时,我想在UIDetailViewUIwebView中显示一些相应的网站。为此,我实施了delegate method protocol。我已经使用的下列代码行中UploadTableViewController.h文件::委托方法协议不工作 - 目标C

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


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

@property (retain) id delegate; 
@end 

在我在.m文件类的使用的代码::

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

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

} 

以下行相应.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]; 
} 

但是,我无法得到hello(令状十个在函数SelectedNSLogged在gdb中。这是我第一次使用这个delegate method protocol。我无法解决这个问题。有人可以帮我吗 ?感谢致敬。

+0

在声明中,委托方法被称为'Selected',但实际上你调用'keySelected'? – trojanfoe

+1

在你的委托中.h:你是否声明它符合'UploadTableViewDelegate'?你有没有像'uploadSpaceTVC.delegate = self'一样在代理.m中设置你的委托? – Pfitz

+0

@Pfitz ..不..我应该在哪里解除它?在'viewDidLoad'方法?? – kamalbhai

回答

3

代表团是这样的

  • 宣布协议 - 当你这样做
  • 申报的委托财产 - 你已经这样做了
  • 在类你想成为代表说它符合协议1

    @interface MyClass : MySuperClass <UploadTableViewDelegate>

  • 设置委托财产,因此委托类可以得到委托的消息

    uploadSpaceTVC.delegate = self;

  • 呼叫你的非委托类的委托方法(UploadSpaceTableViewController

    [self.delegate selected:@"test"];

+0

我应该在哪里或在哪个方法和类中将我的委托设置为'uploadSpaceTVC.delegate = self;'? – kamalbhai

+1

我推荐当你初始化类像'UploadSpaceTableViewController * uploadSpaceTVC = [[UploadSpaceTableViewController alloc] init];' - 在这之后的行 – Pfitz

+0

嗯..你是对的。我已经在代码中看到了'delegate'的错误行。 'Upload.delegate = self;'应该写在'self.Upload = [[UploadSpaceTableViewController alloc] initWithStyle:UITableViewStylePlain]'行的下方。我纠正了它,并且很担心。非常感谢。你能解释我的原因吗? – kamalbhai

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 

与.m,我将跳过了很多不必要的东西:

-(void)viewDidLoad { 
    [self.tableView setDelegate:self]; 
    [self.tableView setDataSource:self]; 
} 
//other code 

而且,你的代表是声明保留,这是ObjC中的绝对否定否。如果使用ARC,声明很弱,或者如果不是,则声明。

在您明确拥有或初始化该对象之前,您也正在通过设置它来生成-uploadPressed:方法中的零代表。下面是它应该是什么样子:

self.Upload = [[UploadSpaceTableViewController alloc]initWithStyle:UITableViewStylePlain]; 
Upload.delegate = self; 
+0

我纠正了它。对不起..它实际上被选中。尽管如此,我并没有在'gdb'中获得'hello'或'lolwa''NSLogged'。 – kamalbhai

+1

为此,您需要成为表视图的代表和数据源。如果使用IB,将代表和数据源插座从表中拖到文件所有者。如果在代码中,声明你的意图符合尖括号<>,然后设置'self.tableView.delegate = self; self.tableView.dataSource = self' – CodaFi

+0

我应该在哪里声明这些?在'UploadPressed'方法中? – kamalbhai