2012-10-13 27 views
5

Tôi có UITableViewCell được phân lớp.Không thể cập nhật khung của đối tượng UI trong UITableViewCell

Tôi cần phải tự động thay đổi khung của nhãn UIL.

Đây là những gì tôi đã thực hiện:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    static NSString *CellIdentifier = @"messageCell"; 
    MessageCell *cell = (MessageCell*) [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath]; 

    cell.Content.Text = @"Content!"; 
    [cell.Content setFrame:CGRectMake(0, 0, 10, 10)]; 
} 

Các văn bản của UILabel không thay đổi vì vậy đây không phải là một vấn đề IBOutlet. Tuy nhiên khung vẫn giữ nguyên như được định nghĩa trong IB.

Tôi đã thực hiện các công cụ như thế này trước đây nên tôi không thực sự chắc chắn điều gì đã xảy ra ở đây ...

Cảm ơn bạn đã trợ giúp.

Edit:

tôi sử dụng

[self.tableView registerNib:[UINib nibWithNibName:@"MessageCell" bundle:nil] 
    forCellReuseIdentifier:@"MessageCell"]; 

trong viewDidLoad

Trả lời

4

Vâng một vài ngày sau khi công bố tiền thưởng tôi đã tìm thấy câu trả lời, tôi hy vọng điều này sẽ giúp một ai đó một ngày nào đó ...

Tôi không phải là 100% chắc chắn lý do tại sao, nhưng những gì tôi đã cố gắng để làm chỉ đơn giản là không thể được thực hiện:

Bạn không thể thay đổi khung của đối tượng nếu bạn đã đặt nó qua Trình tạo giao diện.

Để thực hiện các thay đổi tôi muốn thực hiện, tôi chỉ cần tạo các đối tượng đó theo chương trình trong lớp con của tôi, bên trong "initWithCoder".

content = [[UILabel alloc] initWithFrame:CGRectMake(120, 100, 200, 50)]; 
content.opaque = NO; 
content.numberOfLines = 0; 
[self.contentView addSubview:content]; 

tôi sau đó có thể thay đổi các khung bên trong "- (void) layoutSubviews" (nhưng về cơ bản bất cứ nơi nào tôi muốn)

- (void)layoutSubviews 
{ 
    [super layoutSubviews]; 
    [cell.Content setFrame:CGRectMake(0, 0, 10, 10)]; 

    ... 
2

Phải có một cái gì đó sai đó.

Cố gắng, chỉđể thử nghiệm để thực hiện điều này:

tableView:willDisplayCell:forRowAtIndexPath: 

Giống như

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    MessageCell* aCell = (MessageCell*)cell; 
    aCell.Content.Text = @"Content!"; 
    [aCell.Content setFrame:CGRectMake(0, 0, 10, 10)]; 
} 

kết quả là gì?

+0

vẫn không thay đổi ... – BenB

+0

Tuyệt vời Daniel nó làm việc cho tôi. Cuối cùng, bạn đã đưa ra một giải pháp cho một vấn đề rất nổi tiếng. –

1

Thêm chế độ xem phụ vào cell.Content và đổi kích thước chế độ xem con thay vì nội dung. Các tế bào sẽ luôn luôn được kéo dài để phù hợp trong xem bảng của bạn, do đó bạn không thể làm cho nó nhỏ hơn.
(và tất nhiên để làm cho chiều cao ô nhỏ hơn chỉ áp dụng tableView:heightForRowAtIndexPath:)

+0

Tôi không thử chỉnh sửa giao diện của ô, mà là một nhãn UILabel bên trong ô đó. – BenB

1

Có thể điều này liên quan đến việc sử dụng lại ô. Cố gắng này

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
    { 
     static NSString *CellIdentifier = @"messageCell"; 
     MessageCell *cell = (MessageCell*) [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath]; 
    if(cell == nil) 
     { 
     cell = [[[MessageCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier]autorelease]; 
     } 
     cell.Content.Text = @"Content!"; 
     [cell.Content setFrame:CGRectMake(0, 0, 10, 10)]; 
     return cell; 
    } 
+0

Ứng dụng không bao giờ đạt được (ô == nil) ... – BenB

+0

Bạn đã đặt nguồn dữ liệu của chế độ xem bảng chưa? Những gì bạn có nghĩa là bởi ứng dụng không đạt (cell == nil), là cellForRowAtIndexPath được gọi là? – Animesh

+0

Tôi có nghĩa là ô không bao giờ rỗng – BenB

1

Bạn có xem xét trọng phương pháp - (void) layoutSubviews trong tế bào tùy chỉnh của bạn (ví dụ: MessageCell) và bố trí công cụ của bạn trong đó? Tôi nghĩ đây là nơi an toàn nhất để đặt mã thay đổi bố cục vào, bởi vì ở những nơi khác nó có thể không có bất kỳ hiệu ứng nào. Đừng quên gọi [super layoutSubviews]; khi bạn triển khai layoutSubviews.

Cân nhắc thực hiện theo cách tiếp cận này và cho chúng tôi biết nếu cách này có hiệu quả với bạn! Nhưng bạn cần phải xem xét các hàm ý hiệu suất với phương pháp này, bởi vì layoutSubviews sẽ được gọi mỗi lần cuộn bảng.

EDIT:

để phù hợp với kích thước khung hình phù hợp với nhãn của bạn bên layoutSubviews xem xét sử dụng - (CGSize)sizeWithFont:(UIFont *)font constrainedToSize:(CGSize)size lineBreakMode:(UILineBreakMode)lineBreakMode để tính khung.

+0

Vẫn không nhận được bất kỳ kết quả nào ... Tôi đảm bảo bố cục được ghi đè trong MessageCell đang được gọi và tôi cũng được gọi là chức năng siêu – BenB

+0

Một nỗ lực rất khó xử khác: ghi đè phương thức "- (void) setFrame: (CGRect) frame" trong MessageCell.m của bạn (gọi super một lần nữa) và đặt một câu lệnh NSLog vào đó để xem khi nào nó được gọi trong chu kỳ vẽ lại khung nhìn bảng! –

+0

Và một câu hỏi khác liên quan đến câu trả lời ban đầu của tôi: trong phương pháp "layoutSubviews" đã ghi đè của bạn, khi nào bạn gọi "[super layoutSubviews]"? Thử đặt cuộc gọi thành siêu SAU KHI bạn đã đặt khung cho nhãn của mình. –

2

Bạn không thể chỉnh sửa khung hình của đối tượng giao diện người dùng tạo ra thông qua xib nếu Autolayout đang bật. Có hai cách để thực hiện việc này:

  1. Tắt Tự động điền cho xib đó.

HOẶC

  1. Hãy một IBOutlet cho riêng NSlayout chế đính kèm nó cho phù hợp và cập nhật giá trị tài sản cố định của mình thông qua mã và đừng quên gọi layOutIfNeeded một cách thích hợp trên đối tượng được thực thi hoặc giám sát theo thực hiện.
Các vấn đề liên quan