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

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

新規登録して質問してみよう
ただいま回答率
87.20%
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 の両方の開発を行うことができます。

解決済

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

nekocoffee
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 の両方の開発を行うことができます。

2回答

0評価

0クリップ

229閲覧

投稿2022/06/13 18:04

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

開発環境

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

実現したいこと

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

質問内容

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

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

C#

public override void ViewDidLoad () { base.ViewDidLoad (); // Do any additional setup after loading the view. TimerStart(); } void TimerStart() { // タイマーの間隔(ミリ秒) 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(); }

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

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#

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

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

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

補足2

C#

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

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

推測

C#

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

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

Xcode Interface Builderのコード

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

objectiveC

// WARNING // This file has been generated automatically by Visual Studio to // mirror C# types. Changes in this file made by drag-connecting // from the UI designer will be synchronized back to C#, but // more complex manual changes may not transfer correctly. #import <Foundation/Foundation.h> #import <AppKit/AppKit.h> @interface ViewController : NSViewController { NSSwitch *_autoTimeNotifiBotton; NSSwitch *_autoUpdateBotton; NSTextView *_logTextView; NSTextField *_nowTimeText; NSButton *_searchBottonEnabled_1; NSButton *_searchBottonEnabled_10; NSButton *_searchBottonEnabled_2; NSButton *_searchBottonEnabled_3; NSButton *_searchBottonEnabled_4; NSButton *_searchBottonEnabled_5; NSButton *_searchBottonEnabled_6; NSButton *_searchBottonEnabled_7; NSButton *_searchBottonEnabled_8; NSButton *_searchBottonEnabled_9; NSTextField *_searchResultAfter_1; NSTextField *_searchResultAfter_10; NSTextField *_searchResultAfter_2; NSTextField *_searchResultAfter_3; NSTextField *_searchResultAfter_4; NSTextField *_searchResultAfter_5; NSTextField *_searchResultAfter_6; NSTextField *_searchResultAfter_7; NSTextField *_searchResultAfter_8; NSTextField *_searchResultAfter_9; NSTextField *_searchResultBefore_1; NSTextField *_searchResultBefore_10; NSTextField *_searchResultBefore_2; NSTextField *_searchResultBefore_3; NSTextField *_searchResultBefore_4; NSTextField *_searchResultBefore_5; NSTextField *_searchResultBefore_6; NSTextField *_searchResultBefore_7; NSTextField *_searchResultBefore_8; NSTextField *_searchResultBefore_9; NSSearchField *_searchTextInput_1; NSSearchField *_searchTextInput_10; NSSearchField *_searchTextInput_2; NSSearchField *_searchTextInput_3; NSSearchField *_searchTextInput_4; NSSearchField *_searchTextInput_5; NSSearchField *_searchTextInput_6; NSSearchField *_searchTextInput_7; NSSearchField *_searchTextInput_8; NSSearchField *_searchTextInput_9; NSTextView *_sourceTextView; NSTextField *_urlInputField; } @property (nonatomic, retain) IBOutlet NSSwitch *autoTimeNotifiBotton; @property (nonatomic, retain) IBOutlet NSSwitch *autoUpdateBotton; @property (nonatomic, retain) IBOutlet NSTextView *logTextView; @property (nonatomic, retain) IBOutlet NSTextField *nowTimeText; @property (nonatomic, retain) IBOutlet NSButton *searchBottonEnabled_1; @property (nonatomic, retain) IBOutlet NSButton *searchBottonEnabled_10; @property (nonatomic, retain) IBOutlet NSButton *searchBottonEnabled_2; @property (nonatomic, retain) IBOutlet NSButton *searchBottonEnabled_3; @property (nonatomic, retain) IBOutlet NSButton *searchBottonEnabled_4; @property (nonatomic, retain) IBOutlet NSButton *searchBottonEnabled_5; @property (nonatomic, retain) IBOutlet NSButton *searchBottonEnabled_6; @property (nonatomic, retain) IBOutlet NSButton *searchBottonEnabled_7; @property (nonatomic, retain) IBOutlet NSButton *searchBottonEnabled_8; @property (nonatomic, retain) IBOutlet NSButton *searchBottonEnabled_9; @property (nonatomic, retain) IBOutlet NSTextField *searchResultAfter_1; @property (nonatomic, retain) IBOutlet NSTextField *searchResultAfter_10; @property (nonatomic, retain) IBOutlet NSTextField *searchResultAfter_2; @property (nonatomic, retain) IBOutlet NSTextField *searchResultAfter_3; @property (nonatomic, retain) IBOutlet NSTextField *searchResultAfter_4; @property (nonatomic, retain) IBOutlet NSTextField *searchResultAfter_5; @property (nonatomic, retain) IBOutlet NSTextField *searchResultAfter_6; @property (nonatomic, retain) IBOutlet NSTextField *searchResultAfter_7; @property (nonatomic, retain) IBOutlet NSTextField *searchResultAfter_8; @property (nonatomic, retain) IBOutlet NSTextField *searchResultAfter_9; @property (nonatomic, retain) IBOutlet NSTextField *searchResultBefore_1; @property (nonatomic, retain) IBOutlet NSTextField *searchResultBefore_10; @property (nonatomic, retain) IBOutlet NSTextField *searchResultBefore_2; @property (nonatomic, retain) IBOutlet NSTextField *searchResultBefore_3; @property (nonatomic, retain) IBOutlet NSTextField *searchResultBefore_4; @property (nonatomic, retain) IBOutlet NSTextField *searchResultBefore_5; @property (nonatomic, retain) IBOutlet NSTextField *searchResultBefore_6; @property (nonatomic, retain) IBOutlet NSTextField *searchResultBefore_7; @property (nonatomic, retain) IBOutlet NSTextField *searchResultBefore_8; @property (nonatomic, retain) IBOutlet NSTextField *searchResultBefore_9; @property (nonatomic, retain) IBOutlet NSSearchField *searchTextInput_1; @property (nonatomic, retain) IBOutlet NSSearchField *searchTextInput_10; @property (nonatomic, retain) IBOutlet NSSearchField *searchTextInput_2; @property (nonatomic, retain) IBOutlet NSSearchField *searchTextInput_3; @property (nonatomic, retain) IBOutlet NSSearchField *searchTextInput_4; @property (nonatomic, retain) IBOutlet NSSearchField *searchTextInput_5; @property (nonatomic, retain) IBOutlet NSSearchField *searchTextInput_6; @property (nonatomic, retain) IBOutlet NSSearchField *searchTextInput_7; @property (nonatomic, retain) IBOutlet NSSearchField *searchTextInput_8; @property (nonatomic, retain) IBOutlet NSSearchField *searchTextInput_9; @property (nonatomic, retain) IBOutlet NSTextView *sourceTextView; @property (nonatomic, retain) IBOutlet NSTextField *urlInputField; - (IBAction)AudioStopBotton:(id)sender; - (IBAction)AudioTestBotton:(id)sender; - (IBAction)AudioTextBotton:(id)sender; - (IBAction)AutoUpdateBotton:(id)sender; - (IBAction)Botton:(id)sender; - (IBAction)LogSaveDirBotton:(id)sender; - (IBAction)LogWriteBotton:(id)sender; - (IBAction)testb:(id)sender; - (IBAction)Update:(id)sender; - (IBAction)UpdateBotton:(id)sender; - (IBAction)UrlSetBotton:(id)sender; @end

最後に

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

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

SurferOnWww

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の方でビルドを行うのですが、 ビルド時のエラーチェックではもちろんエラーが表示されず、 (正常に製作中のアプリがプレビューされることからビルド時にエラーは発生していない模様です) また、あえて使用できない関数などをボタンを押して実行されるようにプログラムを記載して 実行を行ったときにエラーがデバッグログに表示されて、アプリが終了することも確認しておりますので、 非表示になっている、ということもなさそうかなと思っております。
SurferOnWww

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 )
SurferOnWww

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スレッドで実行されるようになる。」 とも記載されており、コードを見てみたのですが、自分の例でいうとどのように記載すればよいのかわかりませんでした。

まだ回答がついていません

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

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

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 の両方の開発を行うことができます。