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

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

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

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

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

1回答

937閲覧

navigationが動作しなくなる

kenny_sayama

総合スコア1036

Xcode

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

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2018/05/07 13:51

編集2018/05/07 13:52

前提・実現したいこと

UITextFieldに余白を入れた実装をしたのですが、なぜかnavigationItem.rightBarButtonItemが機能しなくなります。

環境

  • Swift4
  • xcode9.3

発生している問題・エラーメッセージ

swift

1class TableViewController: UITableViewController { 2 3 override func viewDidLoad() { 4 super.viewDidLoad() 5 6 navigationItem.title = "Todo" 7 navigationItem.rightBarButtonItem = UIBarButtonItem(title: "Add", style: .plain, target: self, action: #selector(self.addTodo)) 8 9 // Uncomment the following line to preserve selection between presentations 10 // self.clearsSelectionOnViewWillAppear = false 11 12 // Uncomment the following line to display an Edit button in the navigation bar for this view controller. 13 // self.navigationItem.rightBarButtonItem = self.editButtonItem 14 } 15 16 override func didReceiveMemoryWarning() { 17 super.didReceiveMemoryWarning() 18 // Dispose of any resources that can be recreated. 19 } 20 21 // MARK: - Table view data source 22 23 override func numberOfSections(in tableView: UITableView) -> Int { 24 // #warning Incomplete implementation, return the number of sections 25 return 0 26 } 27 28 override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 29 // #warning Incomplete implementation, return the number of rows 30 return 0 31 } 32 33 // MARK: objces 34 @objc func addTodo(){ 35 let c = AddViewController() 36 navigationController?.pushViewController(c, animated: true) 37 } 38 39}

以下のソースが問題のコードです。

swift

1class AddViewController: UIViewController { 2 3 let label = UILabel() 4 let titleField = UITextField() 5 let bodyField = UITextField() 6 let btn = UIButton() 7 8 override func viewDidLoad() { 9 super.viewDidLoad() 10 11 let viewWidth = self.view.bounds.width 12 let viewHeight = self.view.bounds.height 13 let paddingView = UIView(frame: CGRect(x: 0, y: 0, width: 10, height: 5)) 14 paddingView.backgroundColor = UIColor.clear 15 16 label.frame = CGRect(x: viewWidth / 4, y: viewHeight / 2 - 50, width: viewWidth / 2, height: 30) 17 label.text = "Add your Todo" 18 label.textAlignment = .center 19 self.view.addSubview(label) 20 21 titleField.frame = CGRect(x: 20, y: viewHeight / 2, width: viewWidth - 40, height: 30) 22 titleField.placeholder = "title" 23 titleField.layer.borderWidth = 0.5 24 titleField.leftView = paddingView 25 titleField.leftViewMode = .always 26 self.view.addSubview(titleField) 27 28 bodyField.frame = CGRect(x: 20, y: viewHeight / 2 + 50, width: viewWidth - 40, height: 30) 29 bodyField.placeholder = "body" 30 bodyField.layer.borderWidth = 0.5 31 bodyField.leftView = paddingView 32 //以下のコメントアウトを外すとnavigationItemが動作しなくなる 33 //bodyField.leftViewMode = .always 34 self.view.addSubview(bodyField) 35 } 36 37}

ご助言頂けますと幸いです。

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

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

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

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

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

guest

回答1

0

ベストアンサー

それぞれのtextFieldに別々のpaddingViewを設定するとうまく行きました。

class AddViewController: UIViewController { let label = UILabel() let titleField = UITextField() let bodyField = UITextField() let btn = UIButton() override func viewDidLoad() { super.viewDidLoad() let viewWidth = self.view.bounds.width let viewHeight = self.view.bounds.height let paddingView = UIView(frame: CGRect(x: 0, y: 0, width: 10, height: 5)) paddingView.backgroundColor = UIColor.clear // paddingViewをもう一つ用意する let paddingView2 = UIView(frame: CGRect(x: 0, y: 0, width: 10, height: 5)) paddingView2.backgroundColor = UIColor.clear label.frame = CGRect(x: viewWidth / 4, y: viewHeight / 2 - 50, width: viewWidth / 2, height: 30) label.text = "Add your Todo" label.textAlignment = .center self.view.addSubview(label) titleField.frame = CGRect(x: 20, y: viewHeight / 2, width: viewWidth - 40, height: 30) titleField.placeholder = "title" titleField.layer.borderWidth = 0.5 titleField.leftView = paddingView titleField.leftViewMode = .always self.view.addSubview(titleField) bodyField.frame = CGRect(x: 20, y: viewHeight / 2 + 50, width: viewWidth - 40, height: 30) bodyField.placeholder = "body" bodyField.layer.borderWidth = 0.5 // paddingView2を設定する bodyField.leftView = paddingView2 bodyField.leftViewMode = .always self.view.addSubview(bodyField) } }

参考記事
https://stackoverflow.com/questions/31422247/issue-with-uitextfields-leftview-property

【追記】

extension UIView { func copyView<T: UIView>() -> T { return NSKeyedUnarchiver.unarchiveObject(with: NSKeyedArchiver.archivedData(withRootObject: self)) as! T } }
bodyField.leftView = paddingView.copyView()

投稿2018/05/07 21:28

編集2018/05/08 21:05
newmt

総合スコア1277

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

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

kenny_sayama

2018/05/08 01:41

回答いただきありがとうございます。 別のpaddingViewを用意するという方法で自分も実装してしまったのですが、使い回しが出来ないものかと悩んでおります...
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問