Làm cách nào tôi có thể nhúng UISwitch
một UITableView
ô vào một ô? Có thể xem các ví dụ trong menu cài đặt.
Giải pháp hiện tại của tôi:
UISwitch *mySwitch = [[[UISwitch alloc] init] autorelease];
cell.accessoryView = mySwitch;
Làm cách nào tôi có thể nhúng UISwitch
một UITableView
ô vào một ô? Có thể xem các ví dụ trong menu cài đặt.
Giải pháp hiện tại của tôi:
UISwitch *mySwitch = [[[UISwitch alloc] init] autorelease];
cell.accessoryView = mySwitch;
Câu trả lời:
Đặt nó làm phụ kiệnXem thường là cách để thực hiện. Bạn có thể thiết lập nó trong tableView:cellForRowAtIndexPath:
Bạn có thể muốn sử dụng target / action để làm điều gì đó khi công tắc được bật. 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" );
}
switchView.tag = indexPath.row
để phát hiện chuyển đổi hàng nào Đã thay đổi nhanh chóng
if (indexPath.row == 0) {//If you want UISwitch on particular row
UISwitch *theSwitch = [[UISwitch alloc] initWithFrame:CGRectZero];
[cell addSubview:theSwitch];
cell.accessoryView = theSwitch;
}
initWithFrame
? Tại sao bạn sử dụng addSubview
? switch
không thể được sử dụng như một tên biến.
Bạn có thể chuẩn bị ô trong Interfacebuilder, liên kết nó với IBOutlet của Viewcontroller của bạn và trả lại nó khi tableview 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 với IB) và tải nó bằng UINib khi tạo ô.
Cuối cùng, bạn có thể tạo chuyển đổi theo chương trình và thêm nó vào chế độ xem nội dung hoặc chế độ xem phụ kiện của ô của bạn.
Cái nào phù hợp với bạn nhất phần lớn phụ thuộc vào những gì bạn thích làm. Nếu nội dung số lần xem bảng của bạn được sửa (đối với trang cài đặt, v.v.) thì hai nội dung đầu tiên có thể hoạt động tốt, nếu nội dung động, tôi thích giải pháp có lập trình hơn. Vui lòng trình bày 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.
Đây là một giải pháp hoàn chỉnh hơn, trong đó việc tắt và bật diễn ra trên lớp xem (UITableViewCell) và nó chuyển tiếp các sự kiện tới người đại diện tableView thông qua didSelect
và didDeselect
:
class CustomCell: UITableViewCell {
private lazy var switchControl: UISwitch = {
let s = UISwitch()
s.addTarget(self, action: #selector(switchValueDidChange(_:)), for: .valueChanged)
return s
}()
override func awakeFromNib() {
self.accessoryView = switchControl
self.selectionStyle = .none // to show the selection style only on the UISwitch
}
override func setSelected(_ selected: Bool, animated: Bool) {
super.setSelected(selected, animated: animated)
(self.accessoryView as? UISwitch)?.isOn = selected
}
@objc private func switchValueDidChange(_ sender: UISwitch) { // needed to treat switch changes as if the cell was selected/unselected
guard let tv = self.superview as? UITableView, let ip = tv.indexPath(for: self) else {
fatalError("Unable to cast self.superview as UITableView or get indexPath")
}
setSelected(sender.isOn, animated: true)
if sender.isOn {
tv.delegate?.tableView?(tv, didSelectRowAt: ip)
} else {
tv.delegate?.tableView?(tv, didDeselectRowAt: ip)
}
}
}
Và trên đại diện của bạn
func tableView(_ tableView: UITableView, shouldHighlightRowAt indexPath: IndexPath) -> Bool {
return false // to disable interaction since it happens on the switch
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { // to make sure it is rendered correctly when dequeuing:
// stuff
if isSelected { // stored value to know if the switch is on or off
tableView.selectRow(at: indexPath, animated: true, scrollPosition: .none)
} else {
tableView.deselectRow(at: indexPath, animated: true)
}
// more stuff
}
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
// do your thing when selecting
}
func tableView(_ tableView: UITableView, didDeselectRowAt indexPath: IndexPath) {
// do your thing when deselecting
}