2011-11-09 93 views
9

我試圖將自定義委託添加到我的自定義UITableViewCell。將委託添加到自定義UITableViewCell(訪問錯誤錯誤)

在這個單元格上我有一個按鈕,需要在ViewController中觸發一個UITableView所在的方法。

我正在做所有通常的步驟來添加自定義委託,但由於某種原因,當我在運行時打開該應用程序崩潰並給我一個錯誤的訪問錯誤。

當我評論所有委託代碼時,它的工作正常,所以我的猜測是我添加委託的方式有些問題。當我離開我的id屬性uncommented它似乎崩潰。

我在VC中實現了協議。我沒有將委託分配給cellForRowAtIndexPath:中的單元格。所有委託方法都已到位。 我一直在其他類中使用類似的結構,但從來沒有在UITableViewCells的子類之前。

在我發佈一些代碼之前,我想知道是否有人遇到過這個bug。如果以及如何解決它,或者甚至可以爲UITableViewCell子類創建自定義委託。


編輯:

我customCell.h

#import <UIKit/UIKit.h> 

@class MyTableViewCell; 

@protocol MyTableCellProtocoll <NSObject> 

-(void) didPressButton:(MyTableViewCell *)theCell; 

@end 

@interface MyTableViewCell : UITableViewCell 
{ 

    UIButton *myButton; 

    id<MyTableCellProtocoll> delegationListener; 

} 

@property (nonatomic,retain) UIButton *myButton; 

@property (nonatomic,assign) id<MyTableCellProtocoll> delegationListener; 

- (void) buttonAction; 

@end 

.M

#import "MyTableViewCell.h" 

@implementation MyTableViewCell 

@synthesize myButton; 
@synthesize delegationListener; 

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier 
{ 
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]; 
    if (self) { 
     // Initialization code 

     self.myButton = [UIButton buttonWithType:UIButtonTypeCustom]; 
     self.myButton.backgroundColor = [UIColor clearColor]; 
     self.myButton.frame = CGRectMake(5, 0, 10, 32); 
     self.myButton.titleLabel.adjustsFontSizeToFitWidth = YES; 
     [self.myButton addTarget:self action:@selector(buttonAction) forControlEvents:UIControlEventTouchUpInside]; 
     [self.contentView addSubview:self.myButton]; 
    } 
    return self; 
} 

- (void) buttonAction 
{ 
    NSLog(@"buttonpressed"); 
    [self.delegationListener didPressButton:self]; 
} 

@end 

MyVC實現在.H的委託作爲適當

@interface MyVC : UIViewController <UITableViewDelegate, UITableViewDataSource, MyTableCellProtocoll> 

而且它還使用MyTableCellProtocoll一個delegatemethod在.M

- (void)didPressButton:(MyTableViewCell *)theCell 
{ 
    NSLog(@"didPressButton"); 
} 

我在的cellForRowAtIndexPath指定委託:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{  
    static NSString *CellIdentifier = @"Cell"; 

    MyTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (cell == nil) { 
     cell = [[[MyTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; 
     cell.delegationListener = self; 
    } 

    return cell; 
} 

這些都是我用委託的所有位置。 我想要它做的是改變buttontitle,並在該單元格後插入一些行(修改重複項)

希望這會清除更多的東西。


EDIT2: 按鈕方法不會被調用啓動時在評論部分中所提及般。用日誌編碼的代碼。


EDIT3: 按鈕沒有任何問題。這是代理財產在某個地方搞砸了。隨着斷點和日誌和評論我確信。

該代碼正在運行到我的數據源列表中的最後一個元素,然後崩潰。現在我想我已經接近這個問題了。


最後編輯: 好了,好像所有的代表和按鈕等組件都是沒有問題的。這是heightForRowAtIndexPath:把我搞垮了。 無論如何感謝您的支持!

+0

沒有代碼就無法評論。但是,是的,一個UITableViewCell可以使用一個UIViewController作爲委託 - 你的問題聽起來像委託的標準不正確使用。而......代表團可能不是最好的解決方案,具體取決於。 –

+0

沒有理由不可能在NSObject子類(UITableViewCell是) – jbat100

+0

@PaulLynch中創建一個委託協議和id ivar:我用我的一些代碼編輯了問題。這些位置具有我的委託操作的用法。希望能幫助到你。 –

回答

4

此問題已解決。 問題不在委託中,與其他答案中的按鈕問題無關。問題出在位於heightForRowAtIndexpath中的單元格的訪問中:一旦找出問題就很容易解決。

我很好地指出了jrturton的正確方向,爲此他對此表示感謝。

+3

你能分享這個解決方案嗎? –

1

起初您的界面名爲MyTableViewCell,實現 - iPadCheckTableViewCell。我認爲兩者應該有相同的名稱。

,創造按鈕這樣的:

self.myButton = [UIButton buttonWithType:UIButtonTypeCustom]; // instead of self.myButton = [[UIButton alloc] init]; - it's a memory leak 
+0

啊,是的,它在我的代碼中有相同的名稱。這只是一個錯字。不幸的是不是錯誤。我做了一個編輯^^ –

4

我聽說合成的訪問器不應在init使用。嘗試直接使用實例變量來完成所有的設置代碼:

myButton = [[UIButton alloc] init];   
myButton.backgroundColor = [UIColor clearColor];   
myButton.frame = CGRectMake(5, 0, 10, 32);   myButton.titleLabel.adjustsFontSizeToFitWidth = YES;   
[myButton addTarget:self action:@selector(buttonAction) forControlEvents:UIControlEventTouchUpInside];   
[contentView addSubview:myButton]; 

如果您的按鈕創建更改爲[UIButton buttonWithType:UIButtonTypeCustom];鈹正確地指出,那麼你也將需要retain它。

+0

它不是在這裏搞砸的按鈕。當按鈕被完全註釋掉時,它仍會給我提供相同的bad_access錯誤。 –