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

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

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

HTMLで用いる<button>タグです。

Xcode

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

Swift

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

Q&A

解決済

1回答

1911閲覧

【Swift】UIBarButtonItem Outlet接続されているのにnilになる

shuntar30

総合スコア80

button

HTMLで用いる<button>タグです。

Xcode

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

Swift

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

0グッド

0クリップ

投稿2020/06/03 04:51

Swiftで、コマ撮りを作るアプリを作っています。UICollectionViewでプロジェクト一覧を表示して、削除ボタンを押したら削除できるようにしたいのですが、何回も接続し直しても、何も変わりません。回答お願いします。

ソースコード:

Swift

1// 2// ProjectsViewController.swift 3// ________________ 4// 5// Created by ________ ________ on ______. 6// Copyright © ____ ________ ________. All rights reserved. 7// 8 9import UIKit 10 11class ProjectsViewController: UICollectionViewController { 12 13 @IBOutlet weak var removeButton: UIBarButtonItem! 14 @IBOutlet weak var renameButton: UIBarButtonItem! 15 16 var objects = [ProjectItem]() 17 18 var editProjects = [String]() 19 20 override func viewDidLoad() { 21 super.viewDidLoad() 22 23 let objects = try! FileManager.default.contentsOfDirectory(atPath: NSHomeDirectory() + "/Documents") 24 for i in 0..<objects.count { 25 var images = [String]() 26 do { 27 images = try FileManager.default.contentsOfDirectory(atPath: NSHomeDirectory() + "/Documents") 28 } catch { 29 let alert = UIAlertController(title: """ 30 プロジェクト "(objects[i])" を表示できません。破損している可能性があります。 31 """, message: nil, preferredStyle: .alert) 32 present(alert, animated: true) 33 } 34 if objects[i] != "新規作成" { 35 if images.count != 0 { 36 self.objects.append(ProjectItem(image: UIImage(contentsOfFile: NSHomeDirectory() + "/Documents/" + objects[i] + "/" + images[0]), forName: objects[i])) 37 } else { 38 self.objects.append(ProjectItem(image: nil, forName: objects[i])) 39 } 40 } 41 } 42 self.objects.insert(ProjectItem(image: UIImage(systemName: "plus"), forName: "新規作成"), at: 0) 43 44 let layout = UICollectionViewFlowLayout() 45 layout.itemSize = CGSize(width: view.frame.width / 4 - 20, height: view.frame.width / 4 - 20) 46 layout.sectionInset = UIEdgeInsets(top: 15, left: 15, bottom: 15, right: 15) 47 collectionView.collectionViewLayout = layout 48 self.collectionView.allowsMultipleSelection = false 49 } 50 51 /* 省略 */ 52 53 func removeItem(at indexPath: IndexPath) { 54 let alert = UIAlertController(title: """ 55 コマ撮り "(objects[indexPath.row].string ?? "")" を削除しますか? 56 """, message: "この操作は取り消せません。", preferredStyle: .alert) 57 alert.addAction(UIAlertAction(title: "削除", style: .destructive, handler: { _ in 58 self.objects.remove(at: indexPath.row) 59 self.collectionView.deleteItems(at: [IndexPath(item: indexPath.row, section: 0)]) 60 })) 61 alert.addAction(UIAlertAction(title: "キャンセル", style: .cancel, handler: nil)) 62 present(alert, animated: true) 63 } 64 65 func renameItem(at indexPath: IndexPath, oldName: String?) -> String { 66 return oldName ?? "" 67 } 68 69 override func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { 70 return objects.count 71 } 72 73 override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { 74 let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "Project", for: indexPath) as! CustomCell 75 let label = cell.viewWithTag(1) as! UILabel; label.text = objects[indexPath.row].string ?? "" 76 let imageView = cell.viewWithTag(2) as! UIImageView; imageView.image = objects[indexPath.row].image 77 imageView.tintColor = UIColor.white 78 if objects[indexPath.row].string == "新規作成" { 79 imageView.frame = CGRect(x: Int((view.frame.width / 4.0 - 20.0)) / 4, y: Int((view.frame.width / 4.0 - 20.0)) / 4 - 15, width: Int((view.frame.width / 4.0 - 20.0)) / 2, height: Int((view.frame.width / 4.0 - 20.0)) / 2) 80 } 81 cell.backgroundColor = UIColor.systemGray6 82 return cell 83 } 84 85 override func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { 86 guard let cell: CustomCell = collectionView.cellForItem(at: indexPath) as? CustomCell else { return } 87 if self.collectionView.allowsMultipleSelection { 88 if objects[indexPath.row].string ?? "" != "" { 89 cell.isMarked = true 90 editProjects.append(objects[indexPath.row].string ?? "") 91 // 選択されているセルが1子でなければ無効にする 92 self.renameButton.isEnabled = true 93 if editProjects.count != 1 { 94 self.renameButton.isEnabled = false 95 } 96 } 97 } 98 } 99 100 override func collectionView(_ collectionView: UICollectionView, didDeselectItemAt indexPath: IndexPath) { 101 guard let cell: CustomCell = collectionView.cellForItem(at: indexPath) as? CustomCell else { return } 102 if self.collectionView.allowsMultipleSelection { 103 cell.isMarked = false 104 editProjects.remove(at: editProjects.firstIndex(of: objects[indexPath.row].string!)!) 105 // 選択されているセルが1子でなければ無効にする 106 self.renameButton.isEnabled = true 107 if editProjects.count != 1 { 108 self.renameButton.isEnabled = false 109 } 110 } 111 } 112 113 private func saveImage(image: UIImage, at url: URL) -> Bool { 114 //pngで保存する場合 115 let pngImageData = image.pngData() 116 do { 117 try pngImageData!.write(to: url) 118 } catch { 119 //エラー処理 120 return false 121 } 122 return true 123 } 124 125 func createDir(atPath dirPath: String) throws { 126 let fileManager = FileManager.default 127 do { 128 try fileManager.createDirectory(atPath: dirPath, withIntermediateDirectories: true, attributes: nil) 129 } catch { 130 // エラーの場合 131 throw NSError(domain: error.localizedDescription, code: NSURLErrorCannotCreateFile, userInfo: nil) 132 } 133 } 134 135 136 /* 137 // MARK: - Navigation 138 139 // In a storyboard-based application, you will often want to do a little preparation before navigation 140 override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 141 // Get the new view controller using segue.destination. 142 // Pass the selected object to the new view controller. 143 } 144 */ 145 146}

スクリーンショット

StoryBoardでは表示される
StoryBoardでは名称変更ボタンが表示されますが、
ボタンが表示されない
シミュレーターで起動すると表示されません。

Outlet接続は確実にされています。

エラーの画面です。⤵︎
Thread 1: Fatal error: Unexpectedly found nil while implicitly unwrapping an Optional value

試したこと

・Outlet接続を繋ぎ直した
・デバッガを確認した -> ボタンはnilだった
・名前を変えて、つなぎ直した

ボタンがnilだということから、ボタンが生成されていないのだと思いましたが、解決方法がわかりません。

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

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

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

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

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

guest

回答1

0

自己解決

NavigationItemの文字が英語になるのを防ぐために、StoryBoardを二つ使ったためでした。

投稿2020/06/03 05:05

shuntar30

総合スコア80

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問