2017-05-15 23 views
0

EDIT 2:私はそれを持っていたと思ったが、そうはしなかった。ボタンを押したときに配列を作成する必要がありますが、各オブジェクトの.checkmarkにアクセスする方法を理解できません。私はすでにプロパティとして "。選択"していますが、それにアクセスすることはできません。ボタンを使用して配列を作成/追加する

私はチェックマーク付きで3つのセクションにリストを表示するUITableViewを持っています。チェックされている行がある場合、そのNSObjectクラスに関連付けられているboolがfalseからtrueに変更されます。私はUINavigationBarの中に、 "Send"と "Cancel"オプションで警告が表示されるボタンを持っています。ユーザーが「送信」をタップすると、チェックマークが付いたすべての行が配列に追加されます。私は、そのboolを使うのが最善の方法だと考えましたが、アクションのfuncでは配列の各NSObjectに関連付けられたboolを呼び出すことはできません。私は私を助けるために必要と思われるコードの部分を含めました。

編集:誤解していない限り、私はこれが私のクラスをセットアップする方法だと思います。クラスのバールの1つは「var selected:Bool」です。そのクラスからItemを作成すると、falseに設定されます。私はcellForRowAtでうまく表示されている項目のリストを持っていますが、ボタンがタップされても、同じ「sortedList」にアクセスすることはできません。ここにもっとコードがあります。たぶん私はまだ何か他のものを逃していますか?

var arrayOfItemsSelected = [String]() 

var sortedItems = [[Item]]() 
var itemList: ItemList! { 
    didSet { 
     sortedItems = itemList.sortByBrands() 
     self.tableView.reloadData() 
    } 
} 

オーバーライドFUNC用のtableView(_のtableView:のUITableView、cellForRowAt indexPath:IndexPath) - >のUITableViewCell { LET項目= sortedItems [indexPath.section] [indexPath.row]

let cell = tableView.dequeueReusableCell(withIdentifier: "UIItemViewCell", for: indexPath) 
    cell.textLabel?.text = "\(item.name)" 
    cell.detailTextLabel?.text = "\(item.style)" 

    cell.accessoryType = cell.isSelected ? .checkmark : .none 
    cell.selectionStyle = .none // to prevent cells from being "highlighted" 

    return cell 
} 

    func confirmButtonPressedAction() { 

    // Create the alert controller 
    let alertController = UIAlertController(title: "List of checked items", message: stringOfSelectedItems, preferredStyle: .alert) 

    // Create the actions 
    let okAction = UIAlertAction(title: "Send", style: UIAlertActionStyle.default) { 
     UIAlertAction in 

     self.arrayOfItemsSelected.removeAll() 
     self.tableView.reloadData() 
    } 
    let cancelAction = UIAlertAction(title: "Cancel", style: UIAlertActionStyle.cancel) { 
     UIAlertAction in 
    } 

    // Add the actions 
    alertController.addAction(okAction) 
    alertController.addAction(cancelAction) 

    // Present the controller 
    self.present(alertController, animated: true, completion: nil) 
} 

答えて

0

あなたのコードはarrayOfItemsSelectedで何もしていないか、またはあなたがnです私たちに関連する部分を示してください。そのままでは、コードサンプルは選択された項目を取得も処理もしません。

didSelectRowAt関数とdidDeselectRowAt関数を実装して、Itemクラスの内部フラグを維持するか、indexPathsForSelectedRowsから選択を取得することができます。

UITableViewの選択メカニズムを完全に回避するには、UIItemViewCell自体のアクションでセルのクリック/タップを処理する必要があります(ただし、複雑すぎるようです)。

ところで、デキューしたばかりのセルからcell.isSelectedを使用することは疑問です。また、didviewのclosureでテーブルビューを再利用して再ロードすると、パフォーマンス上の問題、ランダムクラッシュや無限ループの原因となる可能性があります。

+0

アイテムにはBool .selectedがあります。セルがチェックされるとtrueに設定され、チェックされない場合はfalseに設定されます。私はその部分を正しくしたと確信しています。なぜ私は完全に理解していないにもかかわらず、今は正しく動作しているようです。しかし、Sendボタンが押されたときにtrueになるアイテムを移入するための新しい配列を作成しました。今私はあなたの最後の段落を心配しています。私はテーブルビューでiOS をデキューするのに十分なセルを入れなかった。私は何が起こるか見る必要があります... – markith

0

あなたがする必要がオブジェクティブCについて

以下の各アレイobject.linkとブールチェックを追加:

@[ 
    @{ 
    @"Name":@"abc", 
    @"Status":[NSNumber numberWithBool:YES] 
    } 
] 
スウィフトのために

[ 
    [ 
    "Name": "abc", 
    "Status": true 
    ] 
] 
+0

質問はタグ付きswift – Scriptable

+0

私はswiftのための更新コードもあります。 –

+0

編集されたトップポスト(詳細情報と回答あり) – markith

0

あなたはクラスのプロパティcheckedを持っている場合、あなたは試すことができますItem

let itemsChecked = sortedItems.filter { $0.checked == true }

0

をあなたが例に、mymodelのために、各配列オブジェクトにブールチェックを追加する必要があります。チェックし、

myModel.Status = myModel.Status ? false : true 

mymodelというのデフォルトの状態=偽

の行は、その後、 "あなたは、アレイ内の各NSObjectのに関連付けられているブール値を呼び出すことができます"

[ 
"Name": "abc", 
"Status": true 

]

関連する問題