2011-11-09 30 views
9

Tôi đang cố thêm đại biểu tùy chỉnh vào UITableViewCell tùy chỉnh của tôi.Thêm đại biểu vào UITableViewCell tùy chỉnh (lỗi truy cập không hợp lệ)

Trên ô này, tôi có một nút cần phải kích hoạt phương thức trong ViewController nơi đặt UITableView.

Tôi đang làm tất cả các bước thông thường để thêm đại biểu tùy chỉnh nhưng vì một lý do nào đó khi tôi mở VC khi thời gian chạy ứng dụng bị lỗi và cho tôi lỗi truy cập không hợp lệ.

Khi tôi nhận xét tất cả mã đại biểu, nó hoạt động bình thường, do đó, tôi đoán là có điều gì đó sai khi tôi thêm đại biểu của mình. Khi tôi rời khỏi tài sản id của tôi uncommented nó dường như sụp đổ.

Tôi triển khai giao thức trong VC. Tôi đã chỉ định các đại biểu cho các tế bào trong cellForRowAtIndexPath :. Tất cả các phương thức đại biểu được đặt ra. Tôi đã sử dụng các công trình tương tự trong các lớp khác nhưng chưa bao giờ thuộc lớp con của UITableViewCells trước đây.

Trước khi tôi đăng một số mã, tôi muốn biết nếu ai đó gặp phải lỗi này trước đây. Nếu và làm thế nào ông giải quyết nó hoặc nếu nó thậm chí có thể làm cho một đại biểu tùy chỉnh cho một lớp con UITableViewCell.


EDIT:

My 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 thực hiện các đại biểu như đúng trong .h

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

và nó cũng sử dụng một delegatemethod từ MyTableCellProtocoll trong .m

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

tôi gán các đại biểu trong 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; 
} 

Đây là tất cả các địa điểm tôi sử dụng cho các đại biểu. Điều tôi muốn làm là thay đổi phụ đề và chèn một số hàng sau ô đó (bản sao đã sửa đổi)

Hy vọng điều này sẽ làm rõ mọi thứ hơn một chút.


EDIT2: Phương thức nút không được gọi lúc bắt đầu như đã được đo trong phần nhận xét. Mã đã được chỉnh sửa với mã đăng nhập.


EDIT3: Không có gì sai với nút. Đây là tài sản ủy nhiệm bị rối tung ở đâu đó. Với điểm ngắt và nhật ký và nhận xét tôi đã chắc chắn về điều đó.

Mã đang được chạy đến phần tử cuối cùng trong danh sách nguồn dữ liệu của tôi sau đó nó bị treo. 1 bước gần hơn với vấn đề bây giờ tôi giả sử.


CUỐI CÙNG EDIT: Ok, nó có vẻ như tất cả các đại biểu và các nút và các thành phần khác không phải là vấn đề gì cả. Đó là các heightForRowAtIndexPath: screwing tôi hơn. Cảm ơn tất cả các hỗ trợ của bạn dù sao đi nữa!

+0

Không thể nhận xét mà không có mã. Nhưng có, một UITableViewCell có thể sử dụng một UIViewController như là một đại biểu - vấn đề của bạn âm thanh như việc sử dụng không đúng tiêu chuẩn của các đại biểu. Và ... phái đoàn có thể không phải là giải pháp tốt nhất, tùy thuộc. –

+0

Không có lý do gì để không thể tạo giao thức đại biểu và id ivar trong lớp con NSObject (mà UITableViewCell là) – jbat100

+0

@PaulLynch: Tôi đã chỉnh sửa câu hỏi bằng một số mã của tôi. Những địa điểm này có việc sử dụng các hành động đại biểu của tôi. Hy vọng nó giúp. –

Trả lời

4

Câu hỏi này đã được giải quyết. Sự cố không thuộc về đại biểu và không liên quan đến các vấn đề về nút trong các câu trả lời khác. Vấn đề nằm trong việc truy cập một ô trong heightForRowAtIndexpath: và dễ dàng được giải quyết một khi đã tìm ra.

Tôi vui lòng chỉ đúng hướng của jrturton và vì điều này, anh ấy có lời cảm ơn của tôi.

+3

Bạn có thể chia sẻ giải pháp này không? –

1

Lúc đầu, giao diện của bạn được gọi là MyTableViewCell, triển khai - iPadCheckTableViewCell. Tôi nghĩ cả hai nên có cùng tên.

Và tạo nút như thế này:

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

Ah có, Nó có cùng tên trong mã của tôi. Nó chỉ là một lỗi đánh máy. Rất tiếc, không phải lỗi. Tôi thực hiện một chỉnh sửa cho rằng ^^ –

4

Tôi đã nghe nói rằng accessors tổng hợp không nên được sử dụng trong init. Cố gắng làm tất cả các mã cài đặt bằng cách sử dụng ivars trực tiếp:

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]; 

Nếu bạn thay đổi tạo nút của bạn để [UIButton buttonWithType:UIButtonTypeCustom]; như berili đúng gợi ý, sau đó bạn sẽ cũng cần phải retain nó.

+0

Nó không phải là nút đó là sai lầm ở đây tho. Khi nút được nhận xét hoàn toàn nó vẫn mang lại cho tôi cùng một lỗi bad_access. –

Các vấn đề liên quan