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

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

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

CocoaはMac OS X用のアプリケーションを構築する為の主要なフレームワークのひとつです。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

MacOS(OSX)

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

Xamarin

Xamarin(ザマリン)は、iPhoneなどのiOSやAndroidで動作し、C# 言語を用いてアプリを開発できるクロスプラットフォーム開発環境です。Xamarin Studioと C# 言語を用いて、 iOS と Android の両方の開発を行うことができます。

Q&A

解決済

2回答

717閲覧

Xamarin.MacのC#でオブジェクトの指定方法が知りたい

nekocoffee

総合スコア10

Cocoa

CocoaはMac OS X用のアプリケーションを構築する為の主要なフレームワークのひとつです。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

MacOS(OSX)

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

Xamarin

Xamarin(ザマリン)は、iPhoneなどのiOSやAndroidで動作し、C# 言語を用いてアプリを開発できるクロスプラットフォーム開発環境です。Xamarin Studioと C# 言語を用いて、 iOS と Android の両方の開発を行うことができます。

0グッド

0クリップ

投稿2022/06/13 18:04

すみません、プログラムの経験が少なく、間違った表現になってしまっていると思いますが、
懸命に書かせていただきます。
お見苦しいところがあると思いますが、ご了承くださいい。。

開発環境

Xamarin.MacでVisual Studio for Macを使用してプログラムを作成しています。
UIの設計はXcode Interface Builderを使用しております。

実現したいこと

時計機能を実装したいです。

質問内容

現在1秒ごとにメソッドが叩かれる機能を実装したいです。

こちらの実装を行うため、下記のメソッドを作成いたしました。

C#

1public override void ViewDidLoad () 2 { 3 base.ViewDidLoad (); 4 // Do any additional setup after loading the view. 5 TimerStart(); 6 } 7 8void TimerStart() 9 { 10 // タイマーの間隔(ミリ秒) 11 Timer timer = new Timer(1000); 12 13 // タイマーの処理 14 timer.Elapsed += (sender, e) => 15 { 16 //TimerStart()が実行されているかをログで確認する 17 Console.WriteLine(DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss")); 18 19 //nowTimeTextというLabelをXcode Interface Builderで作成しているので、 20 //nowTimeTextに今の時間を代入する 21 nowTimeText.StringValue = DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss"); 22 }; 23 24 // タイマーを開始する 25 timer.Start(); 26 }

こちらのコードを記載して実行するのですが、

Console.WriteLine(DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss"));

こちらは正常に実行されてログに時間が毎秒表示されるのですが、

nowTimeText.StringValue = DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss");

こちらは実行されないのか、nowTimeTextのLabelのStringValueが反映されなくて困っています。
エラーログなどは表示されないので、どう対処してよいのか、、わからず、、

補足1

C#

1partial void Botton(Foundation.NSObject sender) 2 { 3 //ボタンを押した際にログを出力して、メソッドが叩かれていることを確認する 4 Console.WriteLine("ボタンが押された"); 5 6 //nowTimeTextに今の時間を代入する 7 nowTimeText = DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss"); 8 }

こちらのプログラムを記載して、Xcode Interface Builderで設定したBottonというボタンを押した際には
ログの出力、nowTimeTextに今の時間が代入され、UI上に反映されることを確認いたしました。

ボタンを押したときに叩かれるメソッドでは正常に
nowTimeText = DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss");
こちらが働いているみたいでした。

補足2

C#

1public override void ViewDidLoad () 2 { 3 base.ViewDidLoad (); 4 // Do any additional setup after loading the view. 5 TimerStart(); 6 7 nowTimeText = DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss"); 8 }

上記のように初回にロードされる部分に
nowTimeText = DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss");
を記載したところ、アプリの起動時に1度だけnowTimeTextに現在時間が代入され、
UIに反映されることを確認いたしました。

推測

C#

1public override void ViewDidLoad (){} 2partial void Botton(Foundation.NSObject sender){}

上記の2つのメソッド内に記載した
nowTimeText = DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss");
は正常に実行されるので、overrideや、partialなどが関係しているのかなと予想しておりますが、
リファレンスなどを見ても何を意味している言葉なのかが理解できなく、
よくわかりませんでした。

Xcode Interface Builderのコード

ベタ打ちで申し訳ございませんが、記載させていただきます。

objectiveC

1// WARNING 2// This file has been generated automatically by Visual Studio to 3// mirror C# types. Changes in this file made by drag-connecting 4// from the UI designer will be synchronized back to C#, but 5// more complex manual changes may not transfer correctly. 6 7 8#import <Foundation/Foundation.h> 9#import <AppKit/AppKit.h> 10 11 12@interface ViewController : NSViewController { 13 NSSwitch *_autoTimeNotifiBotton; 14 NSSwitch *_autoUpdateBotton; 15 NSTextView *_logTextView; 16 NSTextField *_nowTimeText; 17 NSButton *_searchBottonEnabled_1; 18 NSButton *_searchBottonEnabled_10; 19 NSButton *_searchBottonEnabled_2; 20 NSButton *_searchBottonEnabled_3; 21 NSButton *_searchBottonEnabled_4; 22 NSButton *_searchBottonEnabled_5; 23 NSButton *_searchBottonEnabled_6; 24 NSButton *_searchBottonEnabled_7; 25 NSButton *_searchBottonEnabled_8; 26 NSButton *_searchBottonEnabled_9; 27 NSTextField *_searchResultAfter_1; 28 NSTextField *_searchResultAfter_10; 29 NSTextField *_searchResultAfter_2; 30 NSTextField *_searchResultAfter_3; 31 NSTextField *_searchResultAfter_4; 32 NSTextField *_searchResultAfter_5; 33 NSTextField *_searchResultAfter_6; 34 NSTextField *_searchResultAfter_7; 35 NSTextField *_searchResultAfter_8; 36 NSTextField *_searchResultAfter_9; 37 NSTextField *_searchResultBefore_1; 38 NSTextField *_searchResultBefore_10; 39 NSTextField *_searchResultBefore_2; 40 NSTextField *_searchResultBefore_3; 41 NSTextField *_searchResultBefore_4; 42 NSTextField *_searchResultBefore_5; 43 NSTextField *_searchResultBefore_6; 44 NSTextField *_searchResultBefore_7; 45 NSTextField *_searchResultBefore_8; 46 NSTextField *_searchResultBefore_9; 47 NSSearchField *_searchTextInput_1; 48 NSSearchField *_searchTextInput_10; 49 NSSearchField *_searchTextInput_2; 50 NSSearchField *_searchTextInput_3; 51 NSSearchField *_searchTextInput_4; 52 NSSearchField *_searchTextInput_5; 53 NSSearchField *_searchTextInput_6; 54 NSSearchField *_searchTextInput_7; 55 NSSearchField *_searchTextInput_8; 56 NSSearchField *_searchTextInput_9; 57 NSTextView *_sourceTextView; 58 NSTextField *_urlInputField; 59} 60 61@property (nonatomic, retain) IBOutlet NSSwitch *autoTimeNotifiBotton; 62 63@property (nonatomic, retain) IBOutlet NSSwitch *autoUpdateBotton; 64 65@property (nonatomic, retain) IBOutlet NSTextView *logTextView; 66 67@property (nonatomic, retain) IBOutlet NSTextField *nowTimeText; 68 69@property (nonatomic, retain) IBOutlet NSButton *searchBottonEnabled_1; 70 71@property (nonatomic, retain) IBOutlet NSButton *searchBottonEnabled_10; 72 73@property (nonatomic, retain) IBOutlet NSButton *searchBottonEnabled_2; 74 75@property (nonatomic, retain) IBOutlet NSButton *searchBottonEnabled_3; 76 77@property (nonatomic, retain) IBOutlet NSButton *searchBottonEnabled_4; 78 79@property (nonatomic, retain) IBOutlet NSButton *searchBottonEnabled_5; 80 81@property (nonatomic, retain) IBOutlet NSButton *searchBottonEnabled_6; 82 83@property (nonatomic, retain) IBOutlet NSButton *searchBottonEnabled_7; 84 85@property (nonatomic, retain) IBOutlet NSButton *searchBottonEnabled_8; 86 87@property (nonatomic, retain) IBOutlet NSButton *searchBottonEnabled_9; 88 89@property (nonatomic, retain) IBOutlet NSTextField *searchResultAfter_1; 90 91@property (nonatomic, retain) IBOutlet NSTextField *searchResultAfter_10; 92 93@property (nonatomic, retain) IBOutlet NSTextField *searchResultAfter_2; 94 95@property (nonatomic, retain) IBOutlet NSTextField *searchResultAfter_3; 96 97@property (nonatomic, retain) IBOutlet NSTextField *searchResultAfter_4; 98 99@property (nonatomic, retain) IBOutlet NSTextField *searchResultAfter_5; 100 101@property (nonatomic, retain) IBOutlet NSTextField *searchResultAfter_6; 102 103@property (nonatomic, retain) IBOutlet NSTextField *searchResultAfter_7; 104 105@property (nonatomic, retain) IBOutlet NSTextField *searchResultAfter_8; 106 107@property (nonatomic, retain) IBOutlet NSTextField *searchResultAfter_9; 108 109@property (nonatomic, retain) IBOutlet NSTextField *searchResultBefore_1; 110 111@property (nonatomic, retain) IBOutlet NSTextField *searchResultBefore_10; 112 113@property (nonatomic, retain) IBOutlet NSTextField *searchResultBefore_2; 114 115@property (nonatomic, retain) IBOutlet NSTextField *searchResultBefore_3; 116 117@property (nonatomic, retain) IBOutlet NSTextField *searchResultBefore_4; 118 119@property (nonatomic, retain) IBOutlet NSTextField *searchResultBefore_5; 120 121@property (nonatomic, retain) IBOutlet NSTextField *searchResultBefore_6; 122 123@property (nonatomic, retain) IBOutlet NSTextField *searchResultBefore_7; 124 125@property (nonatomic, retain) IBOutlet NSTextField *searchResultBefore_8; 126 127@property (nonatomic, retain) IBOutlet NSTextField *searchResultBefore_9; 128 129@property (nonatomic, retain) IBOutlet NSSearchField *searchTextInput_1; 130 131@property (nonatomic, retain) IBOutlet NSSearchField *searchTextInput_10; 132 133@property (nonatomic, retain) IBOutlet NSSearchField *searchTextInput_2; 134 135@property (nonatomic, retain) IBOutlet NSSearchField *searchTextInput_3; 136 137@property (nonatomic, retain) IBOutlet NSSearchField *searchTextInput_4; 138 139@property (nonatomic, retain) IBOutlet NSSearchField *searchTextInput_5; 140 141@property (nonatomic, retain) IBOutlet NSSearchField *searchTextInput_6; 142 143@property (nonatomic, retain) IBOutlet NSSearchField *searchTextInput_7; 144 145@property (nonatomic, retain) IBOutlet NSSearchField *searchTextInput_8; 146 147@property (nonatomic, retain) IBOutlet NSSearchField *searchTextInput_9; 148 149@property (nonatomic, retain) IBOutlet NSTextView *sourceTextView; 150 151@property (nonatomic, retain) IBOutlet NSTextField *urlInputField; 152 153- (IBAction)AudioStopBotton:(id)sender; 154 155- (IBAction)AudioTestBotton:(id)sender; 156 157- (IBAction)AudioTextBotton:(id)sender; 158 159- (IBAction)AutoUpdateBotton:(id)sender; 160 161- (IBAction)Botton:(id)sender; 162 163- (IBAction)LogSaveDirBotton:(id)sender; 164 165- (IBAction)LogWriteBotton:(id)sender; 166 167- (IBAction)testb:(id)sender; 168 169- (IBAction)Update:(id)sender; 170 171- (IBAction)UpdateBotton:(id)sender; 172 173- (IBAction)UrlSetBotton:(id)sender; 174 175@end

最後に

初心者で申し訳ございませんが、ご回答いただけますと幸いです。

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2022/06/13 23:23

Visual Studio でデバッグ実行するとエラーメッセージが出ませんか?
nekocoffee

2022/06/14 16:52

@Zuishinさん ご返信ありがとうございます! >Timer がどの Timer かわかりませんが 申し訳ございません、使っているライブラリを記載しておりませんでした。 Timerを使用する際にusing System.Timers;を追記しましたのでこちらのTimerだと思います。 >かわりにXamarin.Forms.Device.StartTimerを使ってみてください。 ご助言ありがとうございます! こちら只今試してみたのですが、「現在のコンテキストに’Device’という名前は存在しません」と エラーが表示されてしまいました。 添付していただきましたサイトよりusing Xamarin.Forms;を記載させていただいたのですが、 こちらも「 型または名前空間の名前’Forms'が名前空間'Xamarin'に存在しません」と表示されてしまいます。 現在使用しているものは using System; using System.IO; using System.Timers; using System.Net; using AppKit; using Foundation; using System.Text; こちらとなっておりまして、よくみるとXamarinの文字がないですね、、 もしかしてXamarinとは無関係の開発環境なのでしょうか、、
nekocoffee

2022/06/14 16:58

@SurferOnWwwさん コメントありがとうございます! ビルドをして動作テストを行う際はもちろんVisual Studioの方でビルドを行うのですが、 ビルド時のエラーチェックではもちろんエラーが表示されず、 (正常に製作中のアプリがプレビューされることからビルド時にエラーは発生していない模様です) また、あえて使用できない関数などをボタンを押して実行されるようにプログラムを記載して 実行を行ったときにエラーがデバッグログに表示されて、アプリが終了することも確認しておりますので、 非表示になっている、ということもなさそうかなと思っております。
退会済みユーザー

退会済みユーザー

2022/06/14 22:43 編集

コンパイル時ではなくて実行時の話です。また、 Timer が別スレッドで動いているのではないかと想像しています。 質問者さんの環境の場合は分かりませんが、Windows 環境での WinForms のマルチスレッドアプリで不正なクロススレッドコールがある場合、Visual Studio から[デバッグの開始(S)]でなら以下のような例外が捕捉されるが、[デバッグなしで開始(H)]では捕捉されないということがあるのです。詳しくは: 不正なクロススレッドコールの捕捉 http://surferonwww.info/BlogEngine/post/2019/07/11/detect-illegal-cross-thread-calls.aspx (逆に、Visual Studio から[デバッグ(D)]⇒[デバッグの開始(S)]でアプリを実行すると try - catch で OperationCanceledException を捕捉できないということもありましたが。 http://surferonwww.info/BlogEngine/post/2021/07/17/cancel-parallel-for-loop.aspx )
退会済みユーザー

退会済みユーザー

2022/06/14 22:55

> Timerを使用する際にusing System.Timers;を追記しましたのでこちらのTimerだと思います。 質問者さんの環境では分かりませんが、Windows OS でその Timer の場合、「.NET Frameworkが管理するスレッドプールによりタイマメソッドが実行される」と言うことなので WinFroms アプリでは注意が必要です。詳しくは: タイマにより一定時間間隔で処理を行うには?(サーバベースタイマ編) https://atmarkit.itmedia.co.jp/ait/spv/0511/11/news119.html
nekocoffee

2022/06/15 17:27

@SurferOnWwwさん 初心者の私に優しくご教授いただき、本当にありがとうございます! >質問者さんの環境の場合は分かりませんが、Windows 環境での WinForms のマルチスレッドアプリで不正なクロススレッドコールがある場合、Visual Studio から[デバッグの開始(S)]でなら以下のような例外が捕捉されるが、[デバッグなしで開始(H)]では捕捉されないということがあるのです。 なるほど!そうなのですね、、私の落ち度でございました。 只今確認を行いましたところ、たしかに[デバッグなしで開始(H)]で確認を行っていた模様でございます。 ですが、なぜか[デバッグの開始]でアプリが起動せず、デバッグログが確認できませんでした。。 ○参考画像 https://1drv.ms/u/s!Ai1sgoCw2-UPholy8L1QWNkQRde_yQ?e=9t0YtH ○再現動画 https://1drv.ms/u/s!Ai1sgoCw2-UPholzMcyasGJYQLQX3g?e=uYyVaR デバッグログが確認できないのはとても痛手ですが、 >Timer が別スレッドで動いているのではないかと想像しています。 こちらがやはり根本的な原因だとすごく思いました! 私の憶測も踏まえて、補足を記載させていただきます。 >質問者さんの環境では分かりませんが、Windows OS でその Timer の場合、「.NET Frameworkが管理するスレッドプールによりタイマメソッドが実行される」と言うことなので WinFroms アプリでは注意が必要です。 こちらですが、参考サイトありがとうございます! とてもわかりやすかったです! サイト内より私の使用しているTimerは 3. サーバベースタイマ:System.Timers.Timerクラス であることが間違いないように思いました! その上でサイトを参考にしますとやはり、 「このタイマでは、スレッドタイマ(System.Threading.Timeクラス)と同様に、.NET Frameworkが管理するスレッドプールによりタイマメソッドが実行されるため、タイマメソッドはTimerクラスをインスタンス化したスレッドとは異なるスレッドで実行される。このため、これをWindowsフォームで利用する場合にはコントロールの操作に関して注意が必要となる」 と記載されており、まさしくこの通りな気がしております。 (Windowsとは環境が異なりますが、同様のエラーが発生しているのかなと推測しております。) 「しかしサーバベースタイマにはSynchronizingObjectプロパティが用意されており、このプロパティにフォームのインスタンスを設定することにより、タイマメソッドがUIスレッドで実行されるようになる。」 とも記載されており、コードを見てみたのですが、自分の例でいうとどのように記載すればよいのかわかりませんでした。
guest

回答2

0

GUIコンポーネントの表示にかかる設定変更は、そのGUI表示スレッドで実行しないといけません

Windowsフォームでの記事ですが、参考になるかと
Windowsフォームで別スレッドからコントロールを操作するには?:.NET TIPS - @IT

投稿2022/06/13 21:41

y_waiwai

総合スコア87774

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

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

Zuishin

2022/06/13 22:31

同じ方法で解決できるんですか? 違うフレームワークなのに?
nekocoffee

2022/06/14 17:10

@y_waiwaiさん >GUIコンポーネントの表示にかかる設定変更は、そのGUI表示スレッドで実行しないといけません >Windowsフォームでの記事ですが、参考になるかと なるほど!この説もすこしは考えまして、先程 public override void ViewDidLoad () { base.ViewDidLoad (); // Do any additional setup after loading the view. // タイマーの間隔(ミリ秒) Timer timer = new Timer(1000); // タイマーの処理 timer.Elapsed += (sender, e) => { //TimerStart()が実行されているかをログで確認する Console.WriteLine(DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss")); //nowTimeTextというLabelをXcode Interface Builderで作成しているので、 //nowTimeTextに今の時間を代入する nowTimeText.StringValue = DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss"); }; // タイマーを開始する timer.Start(); } 上記の通り、 public override void ViewDidLoad (){} こちらのメソッドの中に直接タイマーの処理を記載させていただいたのですが、 結果は変わらずでございました。。 >GUIコンポーネントの表示にかかる設定変更は、そのGUI表示スレッドで実行しないといけません こちらの認識がもし本当であるならtimer.Start();という文言があるので timerというインスタンスを実行する?という認識?になるのかなとも思いましたので、 結果関数を返して実行するのと同じ「そのGUI表示スレッドで実行していない」という認識になってしまう のでしょうか? すみません、初心者なので認識とか言葉使いとか間違っている可能性がございます、、
guest

0

自己解決

SurferOnWwwさんのおかげで解決できました!!
本当にありがとうございます!
原因はy_waiwaiさんからも助言をいただいていたのですが、
>Timer が別スレッドで動いている
のが原因でした!

Windows.FormではInvokeがそれに相当するという旨を参考サイトより見つけましたのですが、
わたしの知識が浅いゆえに使用方法がわかりませんでしたが、
Visual Studioのオートコンプリートで表示されるInvokeと入った関数を片っ端から入れてみたり、
参考サイトの文字規則からうまくいくまでトライアンドエラーを行いまくった所、

C#

1//うまく行った例 2InvokeOnMainThread(new Action(() => 3 { 4 nowTimeText.StringValue = nowTime; 5 })); 6//変更前の記載 7nowTimeText.StringValue = nowTime;

上記のように変更を行いましたら毎秒ごとに
nowTimeText.StringValue = nowTime;が実行され、UI上にも反映されることを確認いたしました!
本当にありがとうございます!

回答としてはy_waiwaiさんが早かったのですが、
参考サイトをたくさん教えていただいたり、親身に返答をくださったSurferOnWwwさんをベストアンサーを
差し上げたいと思っております。

3日間の悩みが解決して本当にうれしいです!
ありがとうございました!

下記が実際に使用、確認する際のコードとなります。

C#

1public override void ViewDidLoad () 2 { 3 base.ViewDidLoad (); 4 // Do any additional setup after loading the view. 5 Test1(); 6 } 7 8void Test1() 9 { 10 // タイマーの間隔(ミリ秒) 11 Timer timer = new Timer(1000); 12 13 // タイマーの処理 14 timer.Elapsed += (sender, e) => 15 { 16 17 nowTime = DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss"); 18 Console.WriteLine(nowTime); 19 InvokeOnMainThread(new Action(() => 20 { 21 nowTimeText.StringValue = nowTime; 22 })); 23 }; 24 25 // タイマーを開始する 26 timer.Start(); 27 }

投稿2022/06/15 17:45

nekocoffee

総合スコア10

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

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

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問