2012-06-06 29 views
6

Tôi gặp sự cố với UITableView bên trong PopoverController. Khi tôi chạm vào ô, hàm didSelectRowAtIndexPath được gọi và ô accessoryType được thay đổi. Ví dụ được đơn giản hóa:UITableViewCell với Dấu kiểm không hiển thị

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 
    UITableViewCell *cell = [self.listItems objectAtIndex:indexPath.row]; 
    cell.accessoryType = UITableViewCellAccessoryCheckmark; 
    [self.tableView reloadData]; 
    [self.popoverController dismissPopoverAnimated:YES]; 
} 

Làm việc, ô được chọn, nhưng không hiển thị trên bảng nhìn của tôi: Tôi không thể thấy dấu kiểm màu xanh lam. Tuy nhiên, trong trạng thái cảm ứng trên ô, dấu kiểm được hiển thị bằng màu trắng (và nền ô có màu xám). Nhưng không hiển thị ở trạng thái mặc định.

Bạn có biết tại sao dấu kiểm của tôi không hiển thị ở trạng thái mặc định không?

Cảm ơn,

Chỉnh sửa: Thêm ảnh chụp màn hình, cho một tế bào với accessoryType = UITableViewCellAccessoryCheckmark

enter image description here

+0

cho trạng thái mặc định bạn phải đặt cell.accessoryType = UITableViewCellAccessoryCheckmark; bên trong - (UITableViewCell *) tableView: (UITableView *) tableView cellForRowAtIndexPath: (NSIndexPath *) phương pháp indexPath. –

+0

Có, tôi đặt nó và nó hoạt động. Vấn đề của tôi là trên màn hình ... – alexmngn

+0

Bây giờ theo mặc định là làm việc, và hiển thị những gì là thiếu –

Trả lời

0

Bạn đang tải lại UITableView nên về mặt lý thuyết các tế bào được tái tạo và thời gian này mà không có dấu kiểm. Hãy làm như sau:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 
    UITableViewCell *cell = [self.listItems objectAtIndex:indexPath.row]; 
    cell.accessoryType = UITableViewCellAccessoryCheckmark; 
    [self.popoverController dismissPopoverAnimated:YES]; 
} 
+0

Nhưng tôi cần tải lại dữ liệu ... – alexmngn

+0

Đủ công bằng, sau đó bạn cần đánh dấu ô cụ thể đó bằng cách nào đó. Vì vậy, khi 'UITableView'is tải lại dấu kiểm sẽ vẫn ở đó. Bạn có thể giữ một tham chiếu đến 'indexPath' và trong' cellForRowAtIndex' bạn quan tâm đến việc kiểm tra. – Peres

+0

Nó không phải là vấn đề, trong 'cellForRowAtIndexPath' của tôi tôi xác minh và thêm dấu kiểm nếu cần thiết. Vấn đề của tôi là trên màn hình, không phải trong chức năng. – alexmngn

2

Tôi gặp vấn đề tương tự ở đâu, sau khi tải lại hàng có dấu kiểm làm phụ kiện, dấu kiểm sẽ không hiển thị (nhưng sẽ hiển thị màu trắng khi hàng được chọn) . Trong thử nghiệm xung quanh vấn đề tôi phát hiện ra rằng dấu kiểm luôn luôn hiện diện trong các tế bào, nó chỉ là trắng-trên-trắng.

Sự hiểu biết của tôi về vấn đề là khi tôi yêu cầu tải lại ô (để tôi có thể hiển thị dấu kiểm), ô hiện tại được đặt trên hàng đợi sử dụng lại, nhưng tại thời điểm đó trạng thái (vì người dùng vừa chọn nó). Nó vẫn ở trạng thái được chọn khi ô trở lại hàng đợi sử dụng lại và bạn định cấu hình lại nó trong tableView: cellForRowAtIndexPath và bởi vì nó được chọn, phụ kiện được đặt bằng màu trắng thay vì màu hiển thị.

Để khắc phục điều này, tôi đã thêm một dòng trong tableView: cellForRowAtIndexPath để buộc không chọn ô. Phụ kiện giờ đây luôn hiển thị khi ô mới được hiển thị.

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    // Get a reusable cell - this only works with Storyboard prototype cells 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"MyCell"]; 

    // THE MAGIC BIT 
    // Force the cell to not be in a selected state.  
    cell.selected = NO; 
    // END MAGIC BIT 

    if (indexPathIsPathOfSelectedRow) { 
     // This is the selected cell, so show the checkmark accessory. 
     cell.accessoryType = UITableViewCellAccessoryCheckmark; 
    } else { 
     // In case we're reusing a cell that previously showed a checkmark, clear it. 
     cell.accessoryType = UITableViewCellAccessoryNone; 
    } 

    return cell; 
} 
3

Tôi đã thử câu trả lời Jacky Boy - không giúp ích gì. Nhưng một cái gì đó đã có trong deselection ...

Vì vậy, tôi đã cố gắng để bỏ chọn các tế bào trong didSelectRowAtIndexPath: trước khi thêm phụ kiện dấu kiểm:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 

    [tableView deselectRowAtIndexPath:indexPath animated:YES]; 
    UITableViewCell* selectedCell = [tableView cellForRowAtIndexPath:indexPath]; 

    if (row != _selectedRow) { 

     if (selectedCell.accessoryType == UITableViewCellAccessoryNone) { 

      selectedCell.accessoryType = UITableViewCellAccessoryCheckmark; 
      _selectedRow = row; 

     } else if (selectedCell.accessoryType == UITableViewCellAccessoryCheckmark) { 

      selectedCell.accessoryType = UITableViewCellAccessoryNone; 
     } 
     [tableView reloadData]; 
    } 

}

Và đối với tôi nó làm việc cuối cùng - dấu kiểm màu tối đẹp hiện rõ ràng trên ô!

Tất nhiên có một phần trong cellForRowAtIndexPath: tương tự như được mô tả trong câu trả lời của arexx.

0

Chạy dưới iOS 6.1, hành vi tôi thấy là ô có dấu kiểm màu trắng trên nền gần như trắng. Điều này dường như đang xảy ra vì mã vẽ phụ kiện đánh dấu tin rằng ô ở trạng thái được đánh dấu, vì vậy thay vì vẽ dấu kiểm trong màu xanh bình thường, mã được vẽ bằng màu trắng.

Đặt trạng thái đã chọn của ô không hoạt động đối với tôi nhưng đặt trạng thái được đánh dấu ngay trước khi đặt loại phụ kiện. Với những điều sau đây tại chỗ, tôi luôn nhận được một dấu kiểm màu xanh đậm.

cell.highlighted = NO; 
if (checked) 
    self.accessoryType = UITableViewCellAccessoryCheckmark; 
else 
    self.accessoryType = UITableViewCellAccessoryNone; 
+0

'Không hoạt động''''''''''''' – Gank

0

Nếu bạn muốn tải lại dữ liệu thì bạn nên lưu trữ chọn Id trong một số biến để lựa chọn duy nhất như rowIndex và sau đó trong

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    //check index 
    if (rowIndex==indexPath.row) 
     {cell.accessoryType = UITableViewCellAccessoryCheckmark; 
     } 
     else{ 
      cell.accessoryType = UITableViewCellAccessoryNone; 
     } 
} 

Cảm ơn.

7

Điều này xảy ra với tôi khi tôi thay đổi tông màu toàn cầu thành màu trắng. Một khi tôi nhận ra, tôi đã đi vào UITableView và thay đổi màu sắc cục bộ chỉ cho bảng này. Đã sửa.

+0

Điều này đã giúp tôi giải quyết vấn đề của mình. Nếu bất kỳ ai khác có vấn đề này và muốn giữ màu sắc toàn cầu được đặt, chỉ cần thay đổi màu trong viewDidLoad() trong lớp TableView của bạn: self.view.tintColor = UIColor.blackColor() – Jordan

0
-(UIImageView *)checkmarkImg{ 
    UIImage *image = [[UIImage imageNamed:@"ic_check_black_24dp.png"] changeColor:CLR_BUY]; 
    UIImageView *checkmark = [[UIImageView alloc] initWithImage:image]; 
    return checkmark; 
} 

     cell.accessoryView = [self checkmarkImg]; 
2

Tôi là lý do ngu ngốc nhất. Tôi đã tạo ra một tableview trong storyboard, với một View Controller kích thước 5,5 inch và quên áp dụng các ràng buộc bố trí.

Sau đó, tôi khởi chạy trong điện thoại 4 inch, Mọi thứ đều ổn, ngoại trừ chế độ xem phụ kiện không hiển thị vì chiều rộng bảng xem lớn hơn màn hình điện thoại. Tôi mất 3 giờ để tìm ra sai lầm của tôi.

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