2011-01-13 30 views
5

Tôi đang cố gắng gỡ lỗi một vấn đề với một ứng dụng mới, và có điều gì đó không đúng. Trong ứng dụng, tôi đang thiết lập UITableViewCells tùy chỉnh bằng cách thêm 2 UILabView và 1 UIImageView trực tiếp vào ô cell.contentViewUITableViewCell không phải lúc nào cũng có thể chọn?

Trong ứng dụng của tôi, một số ô xem bảng không thể chọn được (chúng không trả lời các sự kiện nhấn). Ô thứ 2 trên màn hình luôn không bao giờ được chọn, và sau đó các ô khác ngẫu nhiên cũng không thể chọn được.

Trong nỗ lực của tôi để gỡ lỗi, tôi bị tước tất cả mọi thứ xuống yếu tố cần thiết để trần mã sau đây:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    static NSString *CellIdentifier = @"ReviewCell"; 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (cell == nil) { 
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; 
    cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator; 
    } 
    cell.textLabel.text = @"foo"; 
    return cell; 
} 

Ngay cả điều này là chung chung, nồi hơi mã tấm, trông giống như sau:

không phải tất cả các ô đều có thể chọn được.

Tôi đang thiếu gì?

cập nhật

như một cập nhật tại đây là mã lựa chọn hàng của tôi nếu quan tâm

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 
    ReviewWebViewController *rvc = [[ReviewWebViewController alloc] initWithReview:[self.reviews objectAtIndex:indexPath.row]]; 
    [self.navigationController pushViewController:rvc animated:YES]; 
    [rvc release], rvc=nil; 
} 
+0

và có lẽ, bạn không trả lại nil từ một bảngXem: willSelectRowAtIndexPath: phương thức hay bất kỳ thứ gì? – Brynjar

+0

Bạn đang làm gì trong phương thức * didSelectRowAtIndexPath: *? – EmptyStack

+0

đây là phương pháp didSelectRowAtIndexPath của tôi: \t ReviewWebViewController * rvc = [[ReviewWebViewController alloc] initWithReview: [self.reviews objectAtIndex: indexPath.row]]; \t [self.navigationController pushViewController: rvc hoạt ảnh: YES]; \t [phát hành rvc], rvc = nil; – cpjolicoeur

Trả lời

1

Phân cấp chế độ xem của bạn trông như thế nào? Có hai điều cần lưu ý: hoặc có các khung nhìn khác ngoài khung nhìn bảng có thể chặn các sự kiện cảm ứng, hoặc khung nhìn bảng bên ngoài khung giám sát của nó (và cắt bớt được tắt).

Rất nhiều câu hỏi ngắn về các đề xuất tập trung vào việc triển khai chế độ xem bảng, tôi sẽ xem xét mọi thứ xung quanh nó.

+0

Nó chỉ là UITableViewController cơ bản. Không có gì đặc biệt trong chế độ xem heirarchy. Tôi tạo một UIView và thêm một số phần tử vào nó mà sau đó tôi đặt làm tableHeaderView qua "self.tableView.tableHeaderView = myHeaderView" – cpjolicoeur

+0

và cách UITableViewController được thêm vào hệ thống phân cấp? –

+1

Cuối cùng, tôi đã tải HUD chặn các sự kiện nhấp chuột. Thay vì loại bỏ HUD khỏi superview khi nó đã được thực hiện hoạt hình, tôi chỉ đơn giản là ngừng hoạt hình nhưng để lại HUD tại chỗ – cpjolicoeur

2

tôi đã trúng một lỗi phát âm tương tự cách đây vài tuần. Tôi đã có các nút trong chế độ xem cuộn không phản hồi các lần chạm. Hóa ra là một số UILabel vô hình mà tôi để lại trong tập tin IB của mình, không bao giờ chứa đầy văn bản và quên mất. Nó đang ngồi trên các nút và ngăn chặn các liên lạc của họ.

Cách tôi tìm thấy nó là lặp qua tất cả các bản xem trước của chế độ xem cuộn, chuyển màu nền của mỗi chế độ xem màu vàng. Bạn có thể có một chế độ xem đi lạc đang cản trở các lần chạm không?

Bạn cũng có thể thử kích thước nhãn và hình ảnh trong di động của bạn để một cái gì đó rất nhỏ (10x10) để xem họ đang can thiệp. Như một phương sách cuối cùng, bạn có thể bắt đầu bằng mã mới và thêm lại các phần để xem nơi nó bị hỏng.

Một điểm cuối cùng: Bạn nói rằng bạn đang sử dụng một tùy chỉnh UITableViewCell, nhưng bạn khởi tạo các tế bào với kiểu mặc định:

cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault 
           reuseIdentifier:CellIdentifier] autorelease]; 

nên không được sử dụng tế bào tùy chỉnh của bạn ở đây? Đó có phải là đơn giản hóa ví dụ không?

+0

xin lỗi, giải thích thêm một chút. Tôi không sử dụng IB ở tất cả ở đây, vì vậy tôi không nghĩ rằng tôi sẽ có bất kỳ UILabels mà tôi không thể nhìn thấy, nhưng tôi sẽ cố gắng gợi ý của bạn về tô màu chúng tất cả và xem nếu tôi bị mất một cái gì đó. bởi "tùy chỉnh" UITableViewCell Tôi có nghĩa là tôi đang thêm trực tiếp các phần tử của tôi vào ô trực tiếp cell.contentView và không sử dụng các phần tử cell.textView.text và cell.detailedTextView.text được xác định trước theo mặc định. Tôi tự thêm hai UILabels và một UIImageView vào ô cell.contentView theo cách thủ công. – cpjolicoeur

+0

để kiểm tra, tôi đã xóa tất cả mã tùy chỉnh của mình và sử dụng những gì tôi đã dán ở trên và chỉ đặt cell.textLabel.text = @ "foo" và tôi vẫn không thể nhận được các nhấp chuột nhất quán – cpjolicoeur

+0

neven, như một bản cập nhật, tôi đã tiếp tục và đã làm "for (UIView * v in cell.subviews)" và đặt tất cả để có [UIColor yellowColor] làm màu nền. Tôi cũng tự thiết lập 3 trường mà tôi thêm bằng màu nền đỏ, xanh lục và xanh lục. Đây là một liên kết đến một screencap để minh họa những gì đang xảy ra. Hai ô đầu tiên không nhận được vòi nào ngoại trừ trực tiếp trên chỉ báo tiết lộ (màu trắng). Các tế bào thứ ba tôi có thể nhấp vào bất cứ nơi nào int ông tế bào và vòi nước được đăng ký tốt. http://cl.ly/3q1c453t1D1r3h3B1D11 – cpjolicoeur

1

Tôi đã thử với một ứng dụng mẫu, hoàn toàn bắt chước cách tiếp cận của bạn. Tất cả đều làm việc hoàn toàn tốt đẹp. Tôi tự hỏi tại sao mã của bạn không hoạt động khi mọi bit mã được đề cập ở trên là chính xác. Nếu được yêu cầu, tôi có thể chia sẻ mã của tôi với bạn. Tôi đang sử dụng đoạn mã sau

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{ 
    NSLog(@"Row Tapped At %d",indexPath.row); 
    NextViewController *rvc = [[NextViewController alloc] initWithReview:[self.reviews objectAtIndex:indexPath.row]]; 
    [self.navigationController pushViewController:rvc animated:YES]; 
    [rvc release], rvc=nil; 

} 

nơi Đánh giá * đầu tiên = [[[Review alloc] initWithReviewId: 1 andTitle: @ "đầu tiên"] autorelease]; và vân vân ... self.reviews = [[NSArray alloc] initWithObjects: thứ nhất, thứ hai, thứ ba, thứ tư, thứ năm, thứ sáu, bảy, tám, chín, mười, mười một, mười hai, mười ba, mười bốn, mười lăm, sizteen, không];

Tôi đang sử dụng iPhone SDK 4.2.Please cho tôi biết Nếu đây bắt chước cách tiếp cận của bạn và chính xác cho tôi Nếu tôi đã thực hiện bất kỳ sai lầm. Cảm ơn

+0

Rahul Cảm ơn bạn đã dành thời gian để làm tất cả những việc đó. Tôi cũng đã tạo ra các dự án hoàn toàn mới trong xcode từ đầu cố gắng gỡ lỗi này và tôi không thấy các vấn đề tương tự trong các dự án trống, chỉ là dự án này. Tôi muốn tìm ra lý do tại sao điều này là không làm việc, ngay cả với số tiền tối thiểu của mã (đó là rõ ràng chính xác) doesnt làm việc. – cpjolicoeur

1

Nếu giải pháp Nevan của không giúp đỡ, sau đó cố gắng loại bỏ các tableView: Phương pháp didSelectRowAtIndexPath (hoặc cho ý kiến ​​nó ra) và xem nếu các nút phát sáng với màu xanh ĐIỂM NHẤN khi khai thác. Nếu có, thì tôi sẽ nghi ngờ rằng

ReviewWebViewController *rvc = [[ReviewWebViewController alloc] initWithReview:[self.reviews objectAtIndex:indexPath.row]]; 

Không phải lúc nào cũng trả về một đối tượng. Để xác nhận điều này, hãy đặt một điểm ngắt trên dòng sau và kiểm tra xem rvc đó có phải là rỗng không. Nếu có, thì đó là vấn đề.

+0

Tôi đã nhận xét phương pháp này như một bài kiểm tra trước đây. Vấn đề không phải là không được thiết lập. Phương thức didSelectRowAtIndexPath thậm chí không được gọi ở tất cả trên các vòi cho một số ô, do đó không có gì để gỡ lỗi trong phương thức đó. Khi các vòi được phát hiện, mọi thứ hoạt động như mong đợi và rvc được đặt tốt, tuy nhiên phương pháp này thường không được kích hoạt trên vòi (trừ khi tôi nhấn trực tiếp chỉ báo tiết lộ) – cpjolicoeur

4

Rất nhiều thứ đã được đề cập, mà tôi sẽ không lặp lại.

Nhưng hãy đảm bảo rằng các yếu tố bạn thêm vào UITableViewCell có userInteractionEnabled được đặt thành NO. Đặc biệt là khi không sử dụng IB, không bao giờ đưa ra quá nhiều giả định về mặc định.

1

Điều gì sẽ xảy ra khi bạn loại bỏ dequeueReusableCellWithIdentifier: codepath và luôn sử dụng ô mới - tất cả đều có thể chọn được không?

Có chế độ xem gốc cho UITableViewController có khung nào có thể được đặt nhỏ hơn giới hạn của tableView không? Nếu vậy, chạm bên ngoài giới hạn của phụ huynh này sẽ không đăng ký trong tableView. Bạn vẫn sẽ thấy bảng toàn cảnh miễn là clipSubviews của phụ huynh là KHÔNG.

Ngoài ra, hãy kiểm tra xem cửa sổ ứng dụng của bạn có "muốn toàn màn hình khi khởi chạy" được đặt trong ngòi bút không. Nếu không, thì cửa sổ có thể có kích thước sai và các sự kiện chạm có thể không đạt đến chế độ xem bảng của bạn.

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