标签: appdelegate

从AppDelegate调用方法 - Objective-C

我试图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)

iphone objective-c uiviewcontroller ios appdelegate

12
推荐指数
2
解决办法
1万
查看次数

对于关键视图,此类不符合键值编码.

我在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)

compiler-errors ios ios-universal-app appdelegate

11
推荐指数
1
解决办法
1万
查看次数

加载iOS应用程序后更改根视图控制器.

为了在应用加载时显示我的登录屏幕,而不是在用户登录后显示,我决定在用户​​成功登录时在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)

viewcontroller ios uistoryboardsegue appdelegate

11
推荐指数
1
解决办法
2万
查看次数

从viewcontroller获取appdelegate值

在Appdelegate.h中
我导入了playerviewcontroller两个Appdelegate.hAppdelegate.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

我在这里犯的错误是什么?

objective-c viewcontroller ios appdelegate

11
推荐指数
1
解决办法
2万
查看次数

在Appdelegate的Storyboard中以编程方式为UINavigationcontroller设置rootViewcontroller

我有价值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

11
推荐指数
1
解决办法
4万
查看次数

Swift:如何访问AppDelegate中的navigationController

我在StoryBoard中添加了一个NavigationController,并将其作为初始的viewController.如何访问appDelegate中的NavigationController.从navigationController按Ctrl键拖动到AppDelegate不会创建插座.

navigationcontroller appdelegate swift

11
推荐指数
1
解决办法
1万
查看次数

如何在 iOS 14 (Xcode 12 Beta) 中从 UIKit 生命周期转换为 SwiftUI 生命周期

我目前正在开发我正在使用的 SwiftUI 应用程序SceneDelegateAppDelegate. 我想知道我可以在生命周期的转换UIKitSwiftUI一个地方有一个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 在他们的会议或任何事情中谈论过这个问题。帮助将不胜感激。

ios appdelegate swiftui xcode12

11
推荐指数
2
解决办法
3023
查看次数

SwiftUI 2 访问 AppDelegate

我做了一个小型原型,它使用 Firebase Cloud Messaging 和新的 SwiftUI 2 应用程序生命周期。我添加了一个自定义 AppDelegate via\n@UIApplicationDelegateAdaptor(AppDelegate.self) var delegate并禁用了方法调配以使 FCM 能够工作。一切都按预期进行。

\n

今天一位同事问我是否可以通过UIApplication.shared.delegate. 所以我试了一下,发现似乎有两个不同的 AppDelegate 对象:

\n

po delegate印刷:

\n
<MyProject.AppDelegate: 0x6000009183c0>\n
Run Code Online (Sandbox Code Playgroud)\n

其中po UIApplication.shared.delegate打印:

\n
\xe2\x96\xbf Optional<UIApplicationDelegate>\n  \xe2\x96\xbf some : <SwiftUI.AppDelegate: 0x600000b58ca0>\n
Run Code Online (Sandbox Code Playgroud)\n

现在我想知道访问 AppDelegate 的正确方法是什么?应该通过 an 获取它@EnvironmentalObject并将其传递给所有视图吗?或者通过使用老式的方式UIApplication?\n另外我想了解为什么我最终会得到两个 AppDelegate。

\n

ios appdelegate swiftui

11
推荐指数
1
解决办法
4857
查看次数

isProtectedDataAvailable 在 iOS 中始终返回 true

问题

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 仍然无法访问。可能的原因是什么? …

xcode data-protection objective-c ios appdelegate

10
推荐指数
0
解决办法
960
查看次数

与 AppDelegate 和 SceneDelegate 的深层链接

我正在尝试实现深层链接来导航到应用程序上的帖子,这是一个较旧的项目,所以我必须添加该类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)

deep-linking ios appdelegate swift uiscenedelegate

10
推荐指数
1
解决办法
9406
查看次数