我试图ViewController.m从方法AppDelegate.m内部 调用my的现有方法applicationDidEnterBackground,所以我找到了这个链接:从app delegate调用UIViewController方法,它告诉我实现这段代码:
在我的ViewController.m中
-(void)viewDidLoad
{
[super viewDidLoad];
AppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];
appDelegate.myViewController = self;
}
Run Code Online (Sandbox Code Playgroud)
在我的AppDelegate中:
@class MyViewController;
@interface AppDelegate : UIResponder <UIApplicationDelegate>
@property (weak, nonatomic) MyViewController *myViewController;
@end
Run Code Online (Sandbox Code Playgroud)
在AppDelegate的实现中:
- (void)applicationDidEnterBackground:(UIApplication *)application
{
[self.myViewController method];
}
Run Code Online (Sandbox Code Playgroud)
所以我把这个代码放在我的项目中,它工作得很好,但我不明白代码如何工作,一行一行.怎么sharedApplication办?为什么我必须设置一个委托而不是只创建一个ViewController实例,如:
ViewController * instance = [[ViewController alloc] init];
[instance method];
Run Code Online (Sandbox Code Playgroud) 我在AppDelegate中遇到问题,运行应用程序时出现此错误:
Terminating app due to uncaught exception 'NSUnknownKeyException', reason:
'[<UIApplication 0x856c820> setValue:forUndefinedKey:]:
this class is not key value coding-compliant for the key view.'
Run Code Online (Sandbox Code Playgroud)
这是AppDelegate.h的代码
#import <UIKit/UIKit.h>
@class ViewController;
@interface AppDelegate : UIResponder <UIApplicationDelegate>{
//UINavigationController *navigationController;
}
@property (strong, nonatomic) UIWindow *window;
@property (copy, nonatomic) ViewController * viewController;
@property (copy, nonatomic) UINavigationController * navigationController;
@end
Run Code Online (Sandbox Code Playgroud)
这是AppDelegate.m的代码
#import "AppDelegate.h"
#import "RootViewController.h"
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions: (NSDictionary *)launchOptions
{
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
RootViewController *rootMenu;
if ([[UIDevice currentDevice] …Run Code Online (Sandbox Code Playgroud) 为了在应用加载时显示我的登录屏幕,而不是在用户登录后显示,我决定在用户成功登录时在NSUserDefaults中添加auth对象.当应用程序启动时,检查auth参数,并相应地设置视图控制器(如果用户是auth它将显示一个feed,如果没有它将显示一个登录屏幕)在后一种情况下,我有app委托在用户登录后将根视图控制器重置为源.这是不好的做法还是更好的方法?
在app委托中:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
IIViewDeckController* deckController = [self generateControllerStack];
self.rightController = deckController.rightController;
self.centerController = deckController.centerController;
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
if([[defaults objectForKey:@"auth"] isEqualToNumber:[NSNumber numberWithInt:1]]){
self.window.rootViewController = deckController;
}else{
UIStoryboard *sb = [UIStoryboard storyboardWithName:@"MainStoryboard"
bundle:nil];
UIViewController* vc = [sb instantiateViewControllerWithIdentifier:@"loginViewController"];
self.window.rootViewController = vc;
}
[self.window makeKeyAndVisible];
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleBlackOpaque animated:NO];
return YES;
}
- (void) setRoots
{
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
IIViewDeckController* deckController = [self …Run Code Online (Sandbox Code Playgroud) 在Appdelegate.h中
我导入了playerviewcontroller两个Appdelegate.h和Appdelegate.m文件.
@class PlayerViewController;
@property(nonatomic)float volumeDelegate;
Run Code Online (Sandbox Code Playgroud)
在Appdelegate.m
@synthesize volumeDelegate;
- (void)volumeChanged:(NSNotification *)notification
{
volumeDelegate =1.0
PlayerViewController *volumeObject=[[PlayerViewController alloc]init];
[volumeObject setVolumeForAVAudioPlayer];
}
Run Code Online (Sandbox Code Playgroud)
在Playerviewcontroller.h中
-(void)setVolumeForAVAudioPlayer;
Run Code Online (Sandbox Code Playgroud)
在Playerviewcontroller.m中
@interface PlayerViewController ()
{
AppDelegate *appdelegate;
}
-(void)viewDidLoad
{
appdelegate = (AppDelegate*)[[UIApplication sharedApplication] delegate];
}
-(void)setVolumeForAVAudioPlayer
{
[appdelegate.sharedplayer setVolume:appdelegate.volumeDelegate];
NSLog(@"System Volume in player view: %f",appdelegate.volumeDelegate);
}
Run Code Online (Sandbox Code Playgroud)
当我运行这个时,我得到volumeDelegate零值如下.
播放器视图中的系统音量:0.000000000
我在这里犯的错误是什么?
我有价值NSUserdefaults.我正在使用storyboard,它嵌入在UINavigationController.
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
if([[NSUserDefaults standardUserDefaults]objectForKey:@"isLoggedIn"]){
//show home page here
}else{
// show login view
}
}
Run Code Online (Sandbox Code Playgroud)
我可以使用打开应用程序URL还
- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url {
NSString *text = [[url host] stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
if(text.length > 0){
// show home page
}else {
// show settings page
}
return YES;
}
Run Code Online (Sandbox Code Playgroud)
如何根据检索到的值设置rootViewControllerfor UINavigationController.任何人都可以帮帮我吗?
objective-c storyboard nsuserdefaults uinavigationcontroller appdelegate
我在StoryBoard中添加了一个NavigationController,并将其作为初始的viewController.如何访问appDelegate中的NavigationController.从navigationController按Ctrl键拖动到AppDelegate不会创建插座.
我目前正在开发我正在使用的 SwiftUI 应用程序SceneDelegate和AppDelegate. 我想知道我可以在生命周期的转换UIKit到SwiftUI一个地方有一个App结构,并用scenes等。
另外我想知道如何满足 CoreData 和 PersistentContainers 并将它们注入我们的环境。
我也曾经UIApplicationDelegateAdapter注射过,AppDelegate但@main它给了我错误
'main()' 仅在 iOS 14.0 或更新版本中可用
我@available (iOS 14.0, *)在开始时使用:
import SwiftUI
@available(iOS 14.0, *)
@main
struct MyApp: App {
@UIApplicationDelegateAdaptor(AppDelegate.self) var appDelegate
let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
var body: some Scene {
WindowGroup {
ContentView()
}
}
}
Run Code Online (Sandbox Code Playgroud)
这样做,SceneDelegate代码去哪儿了。我仍然很困惑这种转换是如何进行的。我还没有看到 Apple 在他们的会议或任何事情中谈论过这个问题。帮助将不胜感激。
我做了一个小型原型,它使用 Firebase Cloud Messaging 和新的 SwiftUI 2 应用程序生命周期。我添加了一个自定义 AppDelegate via\n@UIApplicationDelegateAdaptor(AppDelegate.self) var delegate并禁用了方法调配以使 FCM 能够工作。一切都按预期进行。
今天一位同事问我是否可以通过UIApplication.shared.delegate. 所以我试了一下,发现似乎有两个不同的 AppDelegate 对象:
po delegate印刷:
<MyProject.AppDelegate: 0x6000009183c0>\nRun Code Online (Sandbox Code Playgroud)\n其中po UIApplication.shared.delegate打印:
\xe2\x96\xbf Optional<UIApplicationDelegate>\n \xe2\x96\xbf some : <SwiftUI.AppDelegate: 0x600000b58ca0>\nRun Code Online (Sandbox Code Playgroud)\n现在我想知道访问 AppDelegate 的正确方法是什么?应该通过 an 获取它@EnvironmentalObject并将其传递给所有视图吗?或者通过使用老式的方式UIApplication?\n另外我想了解为什么我最终会得到两个 AppDelegate。
isProtectedDataAvailable是真的,但applicationProtectedDataDidBecomeAvailable在 iOS 10~20 秒后被调用,这意味着isProtectedDataAvailable在调用回调之前应该是假的。
我正在开发iOS内置的应用程序Objective C。我已经从 AppStore 配置文件和 xcode plist 为我的应用程序启用了数据保护(当前配置为 FirstUserAuthentication)。
由于 Apple 的数据保护政策,我们的数据库在设备重启和首次解锁后几秒钟内无法访问。因此,当应用程序启动时,我使用以下逻辑限制任何数据库操作。
if([[UIApplication sharedApplication] isProtectedDataAvailable]) {
//access data
}else {
// wait for applicationProtectedDataDidBecomeAvailable callback
}
Run Code Online (Sandbox Code Playgroud)
我发现了一些意想不到的行为。即使[[UIApplication sharedApplication] isProtectedDataAvailable]返回true,在从我上面的代码逻辑中调用10~20秒(宽限期)applicationProtectedDataDidBecomeAvailable回调作为其中的一部分后,由于实际上仍受操作系统保护,数据库被访问并失败。
有什么我想念的吗?当实际受保护的数据尚不可用时,为什么iOS返回[[UIApplication sharedApplication] isProtectedDataAvailable]值为 true?
我正在使用 Xcode 11.0,经过测试的设备 OS 13.2。
对于日志中的某些情况,我发现[[UIApplication sharedApplication] isProtectedDataAvailable]返回 1 但 NSUserDefault 仍然无法访问。可能的原因是什么? …
我正在尝试实现深层链接来导航到应用程序上的帖子,这是一个较旧的项目,所以我必须添加该类SceneDelegate。仅当应用程序处于活动状态或在后台时,深层链接实现才有效。如果应用程序尚未加载,深层链接将不起作用。我看过很多关于此的帖子和教程,但没有找到原因,有人遇到过类似的问题吗?
在类中AppDelegate,我添加了实现来处理以下函数的链接:
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]? = nil) -> Bool {}
func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {}
func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool {}
func application(_ application: UIApplication, open url: URL, sourceApplication: String?, annotation: Any) -> Bool {}
Run Code Online (Sandbox Code Playgroud)
在SceneDelegate我实现处理以下函数中的链接:
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {}
func …Run Code Online (Sandbox Code Playgroud) appdelegate ×10
ios ×8
objective-c ×4
swift ×2
swiftui ×2
deep-linking ×1
iphone ×1
storyboard ×1
xcode ×1
xcode12 ×1