質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
TableView

TableView(UITableView)とは、リスト形式で表示するコントロールで、ほとんどのアプリに使用されています。画面を「行」に分けて管理し、一般的には各行をタップした際に詳細画面に移動します。

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Q&A

解決済

2回答

258閲覧

tableView alerttext

退会済みユーザー

退会済みユーザー

総合スコア0

TableView

TableView(UITableView)とは、リスト形式で表示するコントロールで、ほとんどのアプリに使用されています。画面を「行」に分けて管理し、一般的には各行をタップした際に詳細画面に移動します。

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

0グッド

1クリップ

投稿2017/09/21 00:45

編集2017/09/23 12:18
import UIKit class ViewController: UIViewController,UITabBarDelegate,UITableViewDataSource { @IBOutlet weak var mytableView: UITableView! var Haru = ["cell 追加"] var newname = String() override func viewDidLoad() { super.viewDidLoad() } @IBAction func addbutton(_ sender: Any) { let alert = UIAlertController(title: "タイトル", message: "メッセージ", preferredStyle: .alert) let okAction = UIAlertAction(title: "OK", style: .default, handler: { (action:UIAlertAction!) -> Void in if let textFields = alert.textFields { for textField in textFields { self.kei.insert(textField.text!, at:0) //self.kei.append(textField.text!) } self.mytableView.reloadData() } }) alert.addAction(okAction) let cancelAction = UIAlertAction(title: "Cancel", style: .cancel, handler: nil) alert.addAction(cancelAction) alert.addTextField(configurationHandler: {(textField: UITextField!) -> Void in textField.placeholder = "テキスト" }) alert.view.setNeedsLayout() self.present(alert, animated: true, completion: nil) } func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return Haru.count } func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = UITableViewCell(); cell.textLabel?.text = kei[indexPath.row] cell.textLabel?.textColor = UIColor.brown cell.textLabel?.backgroundColor = UIColor.blue cell.textLabel?.font = UIFont.systemFont(ofSize: 30) return cell } func tableView(_ tableView: UITableView, didSelectRowAtIndexPath: IndexPath){ let alert = UIAlertController(title: "タイトル", message: "メッセージ", preferredStyle: .alert) let okAction = UIAlertAction(title: "OK", style: .default, handler: { (action:UIAlertAction!) -> Void in if let textFields = alert.textFields { for textField in textFields { self.kei.insert(textField.text!, at:0) //self.kei.append(textField.text!) } self.mytableView.reloadData() } }) alert.addAction(okAction) let cancelAction = UIAlertAction(title: "Cancel", style: .cancel, handler: nil) alert.addAction(cancelAction) alert.addTextField(configurationHandler: {(textField: UITextField!) -> Void in textField.placeholder = "テキスト" }) alert.view.setNeedsLayout() self.present(alert, animated: true, completion: nil) } func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) { if editingStyle == .delete { kei.remove(at: indexPath.row) tableView.deleteRows(at: [indexPath], with: .fade) } } func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool { return true } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } }

やりたいこと
他の人の質問を参考にしてcellをタップするとアラートテキストが表示され入力出来るようになったのですが理想としては[cell 追加]以外はタップしても何も入力できないようにしたいです。

func tableView(tableView: UITableView, willSelectRowAtIndexPath indexPath: NSIndexPath) -> NSIndexPath? { switch indexPath.row { case 0: return indexPath // 選択不可にしたい場合は"nil"を返す case 1: return nil default: return indexPath } } func tableView(_ tableView: UITableView, willSelectRowAt indexPath: IndexPath) -> IndexPath? { if kei.count > (indexPath.row + 1) { return nil } return indexPath }

教えていただい通りにこのようにして見たのですがやっぱり[cell 追加]以外はタップしてもアラートテキストが出てくるのですがこの他にさらに別のメソッドが必要なでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

@fuzzball さんの回答を補足すると、 indexPath に選択したセルの位置が渡されるので、選択させたくないセルの位置だったら nil を返す。そうでない場合は、 indexPath をそのまま返すようにします。

IndexPath には sectionrow があって、今回 section は一つしかないので、indexPath.row がセルの位置と等しくなっています。

今回のコードだと、 一番下のセル が反応してほしくないので次のように判定する方法があります。
他にも考え方はあるので参考の一つとしてください。

swift

1override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 2 let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) 3 cell.textLabel?.text = Haru[indexPath.row] 4 cell.selectionStyle = (Haru.count > (indexPath.row + 1)) ? .none : .blue 5 return cell 6} 7 8override func tableView(_ tableView: UITableView, willSelectRowAt indexPath: IndexPath) -> IndexPath? { 9 if Haru.count > (indexPath.row + 1) { 10 return nil 11 } 12 return indexPath 13}

参考

UITableViewのセルを選択不可にする方法

投稿2017/09/21 03:44

編集2017/09/22 01:17
ykws

総合スコア1236

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2017/09/21 04:38

func tableView(tableView: UITableView, willSelectRowAtIndexPath indexPath: NSIndexPath) -> NSIndexPath? { let cell = UITableViewCell(); switch indexPath.row { case 0: return indexPath; // 選択不可にしたい場合は"nil"を返す case 1: cell.textLabel?.text = kei[indexPath.row] return nil; default: cell.textLabel?.text = kei[indexPath.row] return nil; } } 早速教えていただいたことをやって見たのですがうまくできなかったのですがどこらへんが間違っているのか教えて頂けませんか?
ykws

2017/09/21 04:52

どううまくいかないのでしょうか? 一番上のセル以外は選択不可になったと思いますが、そうなっていないですか? また、このメソッドの中で cell を変更しようとするのは不適切で、不要な処理です。
退会済みユーザー

退会済みユーザー

2017/09/21 05:25

画像を追加しました。このようにcellのAppleをタップするとアラートテキストが出てしまうので、アラートテキストでデータを追加できるのを[cell 追加]をタップ時だけデータを入力できるようにしたいのです。 不適切な処理なんですね!勉強になりました。
ykws

2017/09/21 05:34

「cell 追加」が一番下にくるから反応してしまうのですね。 判定方法の考え方の一つを回答に追記しました。
退会済みユーザー

退会済みユーザー

2017/09/21 06:04

func tableView(tableView: UITableView, willSelectRowAtIndexPath indexPath: NSIndexPath) -> NSIndexPath? { switch indexPath.row { case 0: if Haru.count > (indexPath.row + 1) { return nil } return indexPath // 選択不可にしたい場合は"nil"を返す case 1: return nil default: return nil; } } このようにして見ましたが先ほどと結果が変わりませんでした。 もしかしたらコード的に元から出来ないんでしょうか?
ykws

2017/09/21 06:16

if Haru.count > (indexPath.row + 1) この式が switch indexPath.row の中にあるのは変だとは思いませんか? メソッド中への記載を回答に追記しました。
退会済みユーザー

退会済みユーザー

2017/09/21 12:14

qiitaのhttps://qiita.com/takashings/items/36b820f09fb19edd7556の記事では func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { let cell : UITableViewCell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath:indexPath) if indexPath.row == 1 { // セルの選択不可にする cell.selectionStyle = UITableViewCellSelectionStyle.None } else { // セルの選択を許可 cell.selectionStyle = UITableViewCellSelectionStyle.Blue } return cell } このようなコードもあったのですがこれは関係ありますでしょうか?
ykws

2017/09/21 14:12

セルを選択不可にするのも方法の一つです。 回答のコードを参考に、自身のコードではどのセル番号を選択不可にするか、許可するか適切に設定できれば期待する実装ができると思います。
退会済みユーザー

退会済みユーザー

2017/09/21 23:55

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { let cell : UITableViewCell = tableView.dequeueReusableCell(withIdentifier: "Cell", for:indexPath as IndexPath) if kei.count > (indexPath.row + 1) { // セルの選択不可にする } else { // セルの選択を許可 cell.selectionStyle = UITableViewCellSelectionStyle.blue } return cell } func tableView(tableView: UITableView, willSelectRowAtIndexPath indexPath: NSIndexPath) -> NSIndexPath? { switch indexPath.row { case 0: return indexPath; // 選択不可にしたい場合は"nil"を返す case 1: return nil; default: return indexPath; } } 参考にしてこのようにして見たのですがやはり、[cell 追加]以外のcellをタップするとアラートテキストが出でしまいます。この場合やはり私のコードが適切じゃないんでしょうか?もしくこの部分以外のコードに問題があるのでしょうか?
退会済みユーザー

退会済みユーザー

2017/09/22 00:05

あと、私の説明不足かもしれませんが[cell 追加]で入力して追加したデータ(例)Apple、mac, iPhone)をタップしてもアラートテキストが出ないようにしたいです。また選択不可っていう形にすると多分チェックマークやデータの編集などが出来なくなると思うので私がしたいこととしては[cell 追加]のcellだけタップ時にアラートテキストが表示させ入力できるようしたいです。
ykws

2017/09/22 01:20

willSelectRowAtIndexPath の switch 文の条件式が動かしたい条件に沿っていないです。 selectionStyle についてのコードも追記したので見比べてみてください。変数名をリネームされたみたいですが、変更前の状態で更新しています。
退会済みユーザー

退会済みユーザー

2017/09/23 12:16 編集

少し考えば分かることを何度も何度もしつこく質問してすいませんでした。 func didSelectRowAtIndexPathにindexPathを加えたら大丈夫でした。 @ykwsさんのおかげで私のしたいことがなんとか出来ました。 本当にありがとうございました。
ykws

2017/09/23 17:55

Good!
退会済みユーザー

退会済みユーザー

2017/09/23 23:58

tableViewのスワイプについて質問立ててからも私なりに色々考えてやって見たのですがスワイプして削除はできるのですがその先の私がやろうとしていることが出来なく困っています。もし良ければアドバイス頂けませんか?
guest

0

選択させたくないセルは、UITableViewDelegateのtableView(_:willSelectRowAt:)でnilを返せばいいです。

投稿2017/09/21 01:01

fuzzball

総合スコア16731

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問