2012-06-28 67 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