2010-09-22 33 views
72

Làm cách nào để nhúng UISwitch vào ô UITableView? Các ví dụ có thể được nhìn thấy trong menu cài đặt.UISwitch trong ô UITableView

giải pháp hiện tại của tôi:

UISwitch *mySwitch = [[[UISwitch alloc] init] autorelease]; 
cell.accessoryView = mySwitch; 
+3

Điều gì xảy ra với cách hiện tại bạn đang thực hiện? – MobileMon

Trả lời

183

Đặt làm phụ kiệnXem thường là cách để đi. Bạn có thể thiết lập nó trong tableView:cellForRowAtIndexPath: Bạn có thể muốn sử dụng mục tiêu/hành động để làm điều gì đó khi công tắc được lật. Giống như vậy:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    switch([indexPath row]) { 
     case MY_SWITCH_CELL: { 
      UITableViewCell *aCell = [tableView dequeueReusableCellWithIdentifier:@"SwitchCell"]; 
      if(aCell == nil) { 
       aCell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:@"SwitchCell"] autorelease]; 
       aCell.textLabel.text = @"I Have A Switch"; 
       aCell.selectionStyle = UITableViewCellSelectionStyleNone; 
       UISwitch *switchView = [[UISwitch alloc] initWithFrame:CGRectZero]; 
       aCell.accessoryView = switchView; 
       [switchView setOn:NO animated:NO]; 
       [switchView addTarget:self action:@selector(switchChanged:) forControlEvents:UIControlEventValueChanged]; 
       [switchView release]; 
      } 
      return aCell; 
     } 
     break; 
    } 
    return nil; 
} 

- (void)switchChanged:(id)sender { 
    UISwitch *switchControl = sender; 
    NSLog(@"The switch is %@", switchControl.on ? @"ON" : @"OFF"); 
} 
+1

Thay vì MY_SWITCH_CELL phải là số ô tương ứng tôi nghĩ. Nice tất cả xung quanh giải pháp! – testing

+2

Điểm tốt với aCell.accessoryView = switchView; – konradowy

+0

làm thế nào để bạn viết 'aCell.accessoryView = switchView;' với ký hiệu khung? – Jesse

10

Bạn có thể thêm một UISwitch hoặc bất kỳ kiểm soát khác với tế bào của accessoryView. Bằng cách đó nó sẽ xuất hiện ở phía bên tay phải của ô mà có thể là thứ bạn muốn.

2

Bạn có thể chuẩn bị ô trong Interfacebuilder, liên kết nó với IBOutlet của trình điều khiển View của bạn và trả lại khi khung nhìn đang yêu cầu hàng thích hợp.

Thay vào đó, bạn có thể tạo một xib riêng biệt cho ô (lại bằng IB) và tải nó bằng UINib khi tạo ô.

Cuối cùng, bạn có thể tạo công tắc theo chương trình và thêm nó vào chế độ xem nội dung hoặc xem phụ kiện của ô.

Loại nào phù hợp nhất với bạn phần lớn phụ thuộc vào những gì bạn muốn làm. Nếu nội dung xem bảng của bạn là cố định (đối với trang cài đặt, v.v.), hai nội dung đầu tiên có thể hoạt động tốt, nếu nội dung động thì tôi thích giải pháp có lập trình hơn. Vui lòng cụ thể hơn về những gì bạn muốn làm, điều này sẽ giúp trả lời câu hỏi của bạn dễ dàng hơn.

+0

Tôi thích giải pháp có lập trình (mặc dù nó dành cho trang cài đặt), nhưng tôi cũng quan tâm đến việc hai tùy chọn đầu tiên hoạt động như thế nào. Có lẽ bạn có thể giải thích cho họ một chút chi tiết hơn. – testing

8
if (indexPath.row == 0) {//If you want UISwitch on particular row 
    UISwitch *theSwitch = [[UISwitch alloc] initWithFrame:CGRectZero]; 
    [cell addSubview:theSwitch]; 
    cell.accessoryView = theSwitch; 
} 
+0

Tại sao bạn sử dụng 'initWithFrame'? Tại sao bạn sử dụng 'addSubview'? 'chuyển' không thể được sử dụng như một tên biến. – testing

+0

Xin lỗi về tên chuyển đổi. Tôi đã có một số mã .. Tôi chỉ thay đổi tên biến trong đó. – kthorat

+0

Nó làm việc cho tôi. Giải pháp hiệu quả với ít mã hơn. –

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