我試圖將自定義委託添加到我的自定義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:把我搞垮了。 無論如何感謝您的支持!
沒有代碼就無法評論。但是,是的,一個UITableViewCell可以使用一個UIViewController作爲委託 - 你的問題聽起來像委託的標準不正確使用。而......代表團可能不是最好的解決方案,具體取決於。 –
沒有理由不可能在NSObject子類(UITableViewCell是) – jbat100
@PaulLynch中創建一個委託協議和id ivar:我用我的一些代碼編輯了問題。這些位置具有我的委託操作的用法。希望能幫助到你。 –