簡単な問題があります。 Interface BuilderにUISwitchを含むカスタムUITableViewCellを作成しました。
質問1:より簡単でより良い方法ですか?質問2:UITableViewControllerで使用する場合、データを取得する最良の方法は何ですか?ある時点で、テーブルを調べてすべてのセルのステータスを確認する必要がありますORスイッチのステータスが直接変更されたときにフィードバックを送信しますか?
助けてくれてありがとう。
アクセサリビューにUISwitch
を追加できます。それはそれを行う最も簡単な方法であり、「エレガント」に見えることは言うまでもありません。
次に、tableviewコントローラーコードで、スイッチが切り替えられるたびにセレクターを呼び出すか、コントローラーでスイッチの現在のステータスを取得してスイッチ自体を切り替えることもできます。
コードサンプルが必要かどうかを教えてください。
---サンプルコード---
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
//add a switch
UISwitch *switchview = [[UISwitch alloc] initWithFrame:CGRectZero];
cell.accessoryView = switchview;
[switchview release];
}
cell.textLabel.text = [NSString stringWithFormat:@"%d", indexPath.row];
return cell;
}
次に、モデルの変更に基づいてスイッチを更新するメソッドを作成できます。デリゲート、通知、KVOなど、好きなものを使用できます。
例:
- (void)updateSwitchAtIndexPath:(NSIndexPath *)indexPath {
UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath];
UISwitch *switchView = (UISwitch *)cell.accessoryView;
if ([switchView isOn]) {
[switchView setOn:NO animated:YES];
} else {
[switchView setOn:YES animated:YES];
}
}
Switch.tag = indexPath.row;
[Switch addTarget:self action:@selector(updateSwitchAtIndexPath:) forControlEvents:UIControlEventTouchUpInside];
- (void)updateSwitchAtIndexPath:(UISwitch *)aswitch{
FFLog(@"%i",aswitch.tag);
}
ありがとう。 indexPathはありませんが、次のようなタグを使用してセルまたはオブジェクトを識別できます。
if (indexPath.row == 0) {
cell.textLabel.text = @"Twitter";
UISwitch *switchview = [[UISwitch alloc] initWithFrame:CGRectZero];
switchview.tag = 111;
//switchview.selected = 0;
cell.accessoryView = switchview;
[switchview addTarget:self action:@selector(updateSwitchAtIndexPath) forControlEvents:UIControlEventTouchUpInside];
//cell.accessoryType =UITableViewCellAccessoryDisclosureIndicator;
//[switchview release];
}
- (void)updateSwitchAtIndexPath {
for (UITableViewCell * cell in tblView.subviews) {
for (UISwitch *swch in cell.subviews) {
UISwitch *switchView = (UISwitch *)cell.accessoryView;
if (switchView.tag == 111) {
if ([switchView isOn]) {
NSLog(@")>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ON");
}else{
NSLog(@")>>>>>>>>>>>>>>>>>>>>>>>>>>>>> OFF");
}
}
if (switchView.tag == 222) {
if ([switchView isOn]) {
NSLog(@")>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ON");
}else{
NSLog(@")>>>>>>>>>>>>>>>>>>>>>>>>>>>>> OFF");
}
}
}
}
}
2つのオプション:
1)データモデルへのポインターでセルを初期化します。セルにスイッチのデリゲートコールバックを実装させます。スイッチが変更されたら、データモデルへのポインターを使用して、新しい設定を反映します。または、View Controllerへのポインタでセルを初期化します。セルにスイッチデリゲートメソッドを実装してから、適切なセルコンテキスト情報を使用してView Controllerをコールバックします。
2)ビューコントローラーにスイッチデリゲートコールバックを実装させます。スイッチが変更されたら、それがどのスイッチ/セルであったかを判別し(スイッチの「タグ」プロパティを行番号などに設定する必要がある場合があります)、View Controllerのコンテキストで更新を処理します。
Swift 3およびSwift 4でUISwitch
の値を取得するには、ターゲットを追加できます。
func tableView(_ tableView: UITableView, cellForRowAtIndexPath indexPath: IndexPath) -> UITableViewCell {
...
cell.uiSwitch.tag = 100
cell.uiSwitch.addTarget(self, action: #selector(ViewController.switchAtValueChanged(switchFromTableViewCell:)), for: UIControlEvents.valueChanged)
...
}
そして、次のような値を取得できます。
@objc func switchAtValueChanged(uiSwitch: UISwitch) {
if uiSwitch.tag == 100 {
let value = uiSwitch.isOn
}
}