[解決済み] SwiftでUIApplicationをサブクラス化する
質問
Objective C では、main.m ファイルを更新し、UIApplicationMain() のパラメータを変更するだけで十分でした。
return UIApplicationMain(argc, argv, NSStringFromClass([CustomUIApplication class]), NSStringFromClass([AppDelegate class]));
しかし、swiftではmain.mファイルがありません。ガイドによると
"グローバルスコープで書かれたコードはプログラムのエントリポイントとして使用されるため、main関数は必要ありません。"
では、swiftでUIApplicationをサブクラス化するにはどうすればいいのでしょうか?何か提案はありますか?
どのように解決するのですか?
<ブロッククオート注意 は、2019年6月のXCode 10.1およびSwift 5向けに構文が更新されました ( クレジットで mattの回答はこちら &&です。 Tung Fam さんの回答はこちら ) 、もし以前の構文をお探しなら、編集セクションをご覧ください。
OK、私は解決策を見つけました
まず、AppDelegate.swiftファイルの先頭に、次のような行があることに気がつきました。
@UIApplicationMain
この行はスコープの外(ファイルレベル)にあるので、すぐに実行され、コンパイラは標準的なmain関数でこれを翻訳したと推測されます。
そこで、新しいSwift-Onlyのアプリケーションから始めて、これを実行しました。
-
コメントアウトされた
@UIApplicationMain
-
のようにmain.swiftを追加しました(FLApplicationは私のサブクラスです)。
重要 トップレベルステートメントは他のファイルではサポートされていないので、ファイルは main.swift という名前でなければなりません! UIApplicationMain()コールを他のファイル内に追加することはできません。そうでなければ、このエラーが発生します。
トップレベルでは式は許可されません
これがmain.swiftのファイルです。
UIApplicationMain(
CommandLine.argc, CommandLine.unsafeArgv,
NSStringFromClass(FLApplication.self), NSStringFromClass(AppDelegate.self)
)
次に、このコードでUIApplicationのサブクラスFLApplication.swiftのswiftファイルを作成します。
import UIKit
import Foundation
class FLApplication: UIApplication {
override func sendEvent(_ event: UIEvent) {
super.sendEvent(event)
print("send event")
}
}
これで、UIApplicationは正しくサブクラス化され、ログに"send event"のメッセージが表示されるようになりました。
旧版の編集
参考までに、バージョン1とバージョン3ではかなり変更されているので、以前の編集をすべてここに残しておきます。
編集 - 2015年3月
Hu Junfeng氏によってコメントされたように、現在、説明の中にある
UIApplicationMain
と main.swift ファイルについての説明は、The Swift Language Reference の Attributes セクションに記載されています。
リンク
Thomas Verbeek によってコメントされたように XCode 6.3 ベータでは、C_ARGC と C_ARGV がそれぞれ Process.argc と Process.unsafeArgv に名前が変更されたことが分かるかもしれません。main.swiftファイル内のUIApplicationMainの呼び出しは、更新が必要です。
UIApplicationMain(Process.argc, Process.unsafeArgv, NSStringFromClass(FLApplication), NSStringFromClass(AppDelegate))
XCode 8以前の文法は
import Foundation
import UIKit
UIApplicationMain(C_ARGC, C_ARGV, NSStringFromClass(FLApplication), NSStringFromClass(AppDelegate))
編集 - 2016年12月
Xcode 8、ベータ6以前での解決方法
import Foundation
import UIKit
UIApplicationMain(
CommandLine.argc,
UnsafeMutableRawPointer(CommandLine.unsafeArgv)
.bindMemory(
to: UnsafeMutablePointer<Int8>.self,
capacity: Int(CommandLine.argc)),
NSStringFromClass(FLApplication.self),
NSStringFromClass(AppDelegate.self)
)
関連
-
EXC_BAD_ACCESS (code=2, address=0x0)
-
JenkinsがIOSを自動パッケージングしてモミを配布
-
[解決済み] カスタムオブジェクトを含むNSMutableArrayをソートするにはどうすればよいですか?
-
[解決済み] SwiftからObjective-Cのコードを呼び出すにはどうしたらいいですか?
-
[解決済み] 制約条件の変更をアニメーションで表現するには?
-
[解決済み] Swiftで#pragmaマーク?
-
[解決済み] Xcodeにおけるバージョンとビルドの比較
-
[解決済み] iPadマルチタスクのサポートには、これらの方向が必要です。
-
[解決済み] iOSアプリをApple Developer Programや脱獄せずにデバイス上でテストすることができます。
-
[解決済み] iOS 11、Apple TV 4Kなどを搭載したXcode 9でワイヤレスデバッグを行う方法とは?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
EXC_BAD_ACCESS (code=2, address=0x0)
-
JenkinsがIOSを自動パッケージングしてモミを配布
-
[解決済み] iOS 8 UITableViewのセパレータインセット0が機能しない件
-
[解決済み] iOS 13 のフルスクリーンでモーダルを表示する
-
[解決済み] iPhone UITextField - プレースホルダーの文字色を変更する
-
[解決済み] UILabelで複数行のテキストを表示する
-
[解決済み] コア・データ エンティティの全インスタンスを削除する最短の方法
-
[解決済み] UITextBorderStyleNoneを使用してUITextFieldのパディングを設定する
-
[解決済み] UITableView - トップにスクロールする
-
[解決済み] ぼかしの入ったオーバーレイビューの作成