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

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

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

MacOSとは、Appleの開発していたGUI(グラフィカルユーザーインターフェース)を採用したオペレーションシステム(OS)です。Macintoshと共に、市場に出てGUIの普及に大きく貢献しました。

Xcode

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

Swift

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

Q&A

2回答

3141閲覧

NSButton storyboardを使わずにアクション

退会済みユーザー

退会済みユーザー

総合スコア0

MacOS(OSX)

MacOSとは、Appleの開発していたGUI(グラフィカルユーザーインターフェース)を採用したオペレーションシステム(OS)です。Macintoshと共に、市場に出てGUIの普及に大きく貢献しました。

Xcode

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

Swift

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

0グッド

0クリップ

投稿2018/06/13 21:15

オブジェクト数が200を超えるアプリを作成することとなりました。そこで、ストーリーボードを使用してしまうと非常に重くなり、Xcode上でまともにプログラミング等ができなくなってしまいました。

そこでストーリーボードを使用せずに、全てコードだけでOSXアプリを作成したいです。
本当に初歩的なことになってしまうのですが、
ストーリーボードを利用した場合は、@IBAction func ~~ {}の括弧内にボタンを押した時の行動を書くのは理解しています。

コードのみで、NSButtonのアクションの方法を教えていただきたいです。

また、コードで書く際のコツなども教えていただけると幸いです。よろしくお願いいたします。

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

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

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

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

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

guest

回答2

0

回答ではありませんが、InterfaceBuilder(IB)に関する情報を記しておきます

  1. ContainderViewを使ってウィンドウ内/ビュー内を分割できる
  2. 共通な部分は1つのNSViewControllerにまとめられる
  3. Storyboardは分割できる
  4. Xibを使う選択肢もある

1はこんな風に分けられるということです

2は見た目は同じだが内容が違うだけのもの(テーブルのセルのようなもの)は一つのStoryboardを再利用するようにすれば接続等は1回で済みます

このように分けたNSViewControllerを別のStoryboardに分けることが可能です

4ですが、xibはStoryboardと違いシナリオを1ファイルで設定できませんが、そのため、パーツごとにxibがバラバラになるので結果として多量のGUIパーツが一つのxibに乗りにくくなります(=重くなりにくくなる)

投稿2018/06/14 07:29

MasakiHori

総合スコア3384

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

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

0

普段iOSしか書いたことが無いのですが、こんな感じでどうでしょうか?
target(通知先のクラスのインスタンス)とaction(コールする関数名)を指定すればクリック時に呼ばれます。

swift

1class ViewController: NSViewController { 2 3 override func viewDidLoad() { 4 super.viewDidLoad() 5 6 // Do any additional setup after loading the view. 7 8 let btn = NSButton(title: "TEST", target: self, action: #selector(buttonDidClick)) 9 btn.frame = NSRect(x: 50, y: 50, width: 100, height: 100) 10 view.addSubview(btn) 11 } 12 13 @objc private func buttonDidClick(_ sender: NSButton) { 14 print("clicked!!") 15 } 16 17 override var representedObject: Any? { 18 didSet { 19 // Update the view, if already loaded. 20 } 21 } 22 23 24}

投稿2018/06/14 01:58

takabosoft

総合スコア8356

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

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

退会済みユーザー

退会済みユーザー

2018/06/14 05:07

let btn = NSButton(title: "TEST", target: self, action: #selectpr(buttonDidClick))のところで Cannot invoke initializer for type 'NSButton' with an argument list of type '(title: String, target: ViewController)' と Expected expression in list of expressions の二つのエラーが出ました。どう改善すべきですか?
takabosoft

2018/06/14 05:16 編集

先の構文はXcodeやmacOSのバージョンの制約があるようです(macOS 10.12以降)。それより古い場合は let btn = NSButton(frame: NSRect(x: 50, y: 50, width: 100, height: 100)) btn.target = self btn.action = #selector(buttonDidClick) こんな感じでいかがでしょうか。
退会済みユーザー

退会済みユーザー

2018/06/14 07:23

動きました!ありがとうございます。 ボタンを押した時、ラベルに表示したいのですがどうすればよいでしょうか? 何度もすみません
takabosoft

2018/06/14 07:45

ボタンが押されたらbuttonDidClick関数がコールされていると思いますので、中でラベルのテキストを更新すればいいんじゃないですかね?どこでつまずいていますか?
退会済みユーザー

退会済みユーザー

2018/06/14 08:34

import Cocoa class ViewController: NSViewController { let button = NSButton() var label = NSTextField() let combo = NSComboBox() override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view. let label = NSTextField(frame: NSRect(x: 20, y: 20, width: 150, height: 50)) label.stringValue = "実行結果" label.backgroundColor = NSColor.green view.addSubview(label) // コンボボックス let num = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100] let combo = NSComboBox(frame: NSRect(x: 60, y: 745, width: 50, height: 26)) combo.intValue = 0 for combo0 in num { combo.addItem(withObjectValue: Int(combo0)) } view.addSubview(combo) let button = NSButton() button.target = self button.action = #selector(buttonDidClick) button.frame = NSRect(x:200, y: 200, width: 100, height: 50) button.title = "計算" view.addSubview(button) } override var representedObject: Any? { didSet { // Update the view, if already loaded. } } @objc private func buttonDidClick(_ sender: Any) { label.intValue = combo.intValue } } ラベルはstring型なのですが、実行後はint型の値を代入したいです。 ボタンを押しても、ラベルは実行結果のまま変わりません。
takabosoft

2018/06/14 08:40

それはプロパティで保持しているlabelが、viewDidLoad内で生成したlabelと違うインスタンスだからです。
退会済みユーザー

退会済みユーザー

2018/06/18 08:39

[クラス]の中に記述した変数とか定数とか関数とかをまとめてプロパティと呼ぶことなどは理解しているのですが、どのように修正すればよいのでしょうか。
takabosoft

2018/06/18 08:40

let label = のletを外せばよいです。
退会済みユーザー

退会済みユーザー

2018/06/18 08:53

letを外したのですが、comboboxから0以外の数値を選択してbuttonを押しても、ラベルには0しか出力されません。何度もすみません。
takabosoft

2018/06/18 09:02

let combo =のletを外せばよいです。なぜそれで動くのかを考察してください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問