标签: appdelegate

从appdelegate更新viewcontroller-最佳做法?

我正在与iBeacons一起在AppDelegate.swift中实现CoreLocation方法(在AppDelegate中实现方法以确保App后台功能)

在“ ViewController.swift”随附的SingleView应用程序中,将数据从AppDelegate传递到ViewController以更新视图(例如UIImages,UILabels或UITableViews)的最佳实践是什么?

我已经成功实现了两种不同的方法:

1)委托,通过在AppDelegate.swift中触发Viewcontroller委托方法:

protocol BeaconLocationDelegate { func minorBeaconChanged(minorValue:NSNumber) }

var locationDelegate: BeaconLocationDelegate

locationDelegate?.minorBeaconChanged(nearestBeacon.minor)
Run Code Online (Sandbox Code Playgroud)

ViewController.swift:

在viewDidLoad方法中:

(UIApplication.sharedApplication().delegate as AppDelegate).locationDelegate = self
Run Code Online (Sandbox Code Playgroud)

(我发现这看起来很难看-将此属性声明为委托的更好方法吗?)

协议实现:

func minorBeaconChanged(minorValue: NSNumber) {
  // do fancy stuff here
}
Run Code Online (Sandbox Code Playgroud)

2)通过在AppDelegate中创建对ViewController的引用:

let viewController:ViewController = window!.rootViewController as ViewController
viewController.doSomethingFancy()
Run Code Online (Sandbox Code Playgroud)

两种方法对我来说都很好用,但是我认为通过委派的第一种方法更优雅,并且在拥有多个ViewController时是更好的选择。

有什么建议吗?

delegation viewcontroller appdelegate swift

6
推荐指数
1
解决办法
2548
查看次数

可以[self.window makeKeyAndVisible]; 在设置rootviewcontroller之前调用

我的要求是UITabBarController是rootviewcontroller,并且在第一次启动应用程序时,我想要显示UINavCon内部的登录过程,我正在显示它presentViewController.

我不希望第一次看到UITabBarController并且不想如何登录UINavCon作为模态弹出.

我想让用户体验如果应用程序第一次启动登录UINavCon应该是可见的.所以这是我的代码:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{

self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; 

[self.window makeKeyAndVisible];//is it correct to call it here?

LoginVC *loginObj = [[LoginVC alloc]init];

self.navigationController = [[UINavigationController alloc] initWithRootViewController:cellPhoneNumber];

self.tabBarController = [[UITabBarController alloc]init];

self.window.rootViewController = self.tabBarController;

[self.tabBarController presentViewController:self.navigationController animated:NO completion:^{}];

return YES;
}
Run Code Online (Sandbox Code Playgroud)

我正在呼叫[self.window makeKeyAndVisible];第二行uiwindow alloc init.这样做是否正确,或者我可能遇到像viewcontroller没有接收事件或方向通知的问题?

objective-c uiviewcontroller uiwindow ios appdelegate

5
推荐指数
2
解决办法
7647
查看次数

如何从扩展 iOS 8 获取 NSManagedObjectContext 实例

我创建了键盘扩展,并且需要访问 CoreData。它在容器应用 AppDelegate 中运行良好。但是从扩展中我无法访问数据。首先,我需要 NSManagedObjectContext 的实例,而我没有。

那么我怎样才能通过使用 AppGroup 或其他东西来获取这个上下文呢?

顺便说一句,当扩展启动时,它会在日志下一条消息中打印:

Warning: CFFIXED_USER_HOME is not set!  It should be set to the simulated home directory.
Failed to inherit CoreMedia permissions from 16808: (null)
Run Code Online (Sandbox Code Playgroud)

它有什么问题?

core-data appdelegate ios8 ios-app-group

5
推荐指数
1
解决办法
2300
查看次数

将 AppDelegate.h 和 AppDelegate.m 替换为 AppDelegate.swift

我只有一个 Objective-C 项目,我想使用 AppDelegate 来访问我的 xcdatamodel,但是当我添加AppDelegate.swift到我的项目时,它显示了一个编译问题,这是错误的,因为它不知道 AppDelegate 使用什么以及什么是主要的。然后我尝试删除AppDelegate.hAppDelegate.m添加AppDelegate.swift,但它也不起作用并且仍然有编译错误。我如何添加AppDelegate.swift它?

xcode objective-c ios appdelegate swift

5
推荐指数
1
解决办法
2051
查看次数

在初始化第一个视图控制器之前运行代码(基于故事板的应用程序)

我的应用程序需要执行一些清理任务 - 删除本地存储的旧数据 - 每次启动时,在显示初始视图控制器之前。

这是因为初始视图控制器在初始化时加载现有数据,并将其显示在表视图中。

我设置了几个断点,并发现初始视图控制器的初始化程序 ( init?(coder aDecoder: NSCoder)) 运行之前 application(_:didFinishLaunchingWithOptions)- 甚至之前application(_:**will**FinishLaunchingWithOptions),准确地说。

可以将清理代码放在视图控制器初始值设定项的最顶部,但我想将清理逻辑与任何特定屏幕分离。有一天,那个视图控制器可能最终不会成为最初的视图控制器。

覆盖应用程序委托的init()方法并将我的清理代码放在那里确实可以完成工作,但是......

题:

没有更好/更优雅的方式吗?


注:供参考,相关方法的执行顺序如下:

  1. AppDelegate.init()
  2. 视图控制器.init()
  3. AppDelegate.application(_:willFinishLaunchingWithOptions:)
  4. AppDelegate.application(_:didFinishLaunchingWithOptions:)
  5. ViewController.viewDidLoad()

澄清:

清理任务不冗长,也不需要异步运行:相反,我宁愿如果我的初始视图控制器甚至没有实例化,直到它完成(我清楚,如果它需要的系统会杀了我的应用程序启动时间很长。但是,它只是删除了一些本地文件,没什么大不了的。)。

我问这个问题主要是因为,在故事板出现之前,应用程序启动代码如下所示:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    // Override point for customization after application launch.
    self.window.backgroundColor = [UIColor whiteColor];

    // INITIAL VIEW CONTROLLER GETS INSTANTIATED HERE 
    // (NOT BEFORE):
    MyViewController* controller = …
Run Code Online (Sandbox Code Playgroud)

uiviewcontroller ios uistoryboard appdelegate

5
推荐指数
1
解决办法
2466
查看次数

从 AppDelegate 方法导航到特定的视图控制器

目前,我已经在我的 AppDelegate 中实现了这两个方法

func application(application: UIApplication, continueUserActivity userActivity: NSUserActivity, restorationHandler: ([AnyObject]?) -> Void) -> Bool
Run Code Online (Sandbox Code Playgroud)

func application(app: UIApplication, openURL url: NSURL, options: [String : AnyObject]) -> Bool
Run Code Online (Sandbox Code Playgroud)

如果用户使用 Spotlight 的搜索结果打开我的应用程序,第一个将被调用,如果我的应用程序从 Apple Maps(因为它是一个路由应用程序)打开,则第二个将被调用。

我的问题是,UIViewController从 AppDELEGATE转到特定位置的最佳方法是什么(无论用户处于何种视图都独立)?

我问的原因是因为目前我正试图根据用户所在的位置手动导航到它。例如,它们可能位于以UIViewController模态显示的a中(然后需要关闭),或者它们可能位于 a 的深处,UINavigationController然后应用程序需要在其中调用popToRootViewController.

这样做的话,代码会变得杂乱无章,而且似乎无法正常工作。这样做似乎也不正确,因为它非常脆弱。

uitabbarcontroller uiviewcontroller ios appdelegate nsuseractivity

5
推荐指数
1
解决办法
1638
查看次数

如何将另一个可可应用程序窗口置于前面

我开发了一个 Mac OS 应用程序。同一包中有一个主窗口应用程序和一个菜单栏帮助程序应用程序。

帮助应用程序有一个名为“显示主应用程序”的菜单项。如果我单击菜单项后未启动辅助应用程序,则辅助应用程序应启动主应用程序。如果辅助应用程序隐藏在扩展坞中或其主窗口已关闭,则辅助应用程序应将主应用程序置于最前面。

我知道如何启动主应用程序。但我不知道如何实现重新激活功能。我使用了如下代码。

let apps = NSRunningApplication.runningApplications(withBundleIdentifier: "com.xxx.yyy")
if let mainApp = apps.first {
       mainApp.activate(options: [ .activateIgnoringOtherApps ])
}
Run Code Online (Sandbox Code Playgroud)

当主应用程序刚刚启动并隐藏在扩展坞中时,激活方法似乎不执行任何操作。我注意到主应用程序实际上已激活,因为主菜单栏已更改为主应用程序的主菜单。但其AppDelegate类的“applicationShouldHandleReopen”方法没有被调用。所以主窗口不能放在前面。

我怎样才能让它发挥作用?

macos cocoa appdelegate swift

5
推荐指数
1
解决办法
2196
查看次数

锁定设备超过 2 分钟后不会调用 applicationProtectedDataDidBecomeAvailable

我的应用程序依赖于applicationProtectedDataDidBecomeAvailable被调用,但我注意到,如果我锁定设备并等待大约 3 分钟然后解锁,则applicationProtectedDataDidBecomeAvailable不会被调用。另外,什么时候会applicationProtectedDataDidBecomeAvailable被调用,而不是applicationWillEnterForeground因为我注意到,当它被调用时,有时这些调用的顺序是随机的

多谢你们

data-protection objective-c ios appdelegate swift

5
推荐指数
0
解决办法
1352
查看次数

以编程方式更改 UINavigationbar 背景颜色和标题字体/颜色

我想在 iOS 11 和 AppDelegate 的 swift 4 中以编程方式更改导航栏背景颜色、标题字体和颜色。我知道如何使用 Xcode 执行此操作,但没有找到以编程方式执行此操作的最新解决方案。

ios appdelegate swift swift4 ios11

5
推荐指数
2
解决办法
7009
查看次数

applicationDidBecomeActive 未调用,而其他委托正常调用

就像标题一样,我在某些用户设备上遇到了一个非常奇怪的错误。我已经搜索过,但找不到任何与我完全相同的问题。

以下是有关此错误的更多详细信息:

  • applicationDidBecomeActive 未被调用,但其他委托(didFinishLaunchingWithOptions、applicationWillEnterForeground、applicationDidEnterBackground,...)被正常调用。
  • 重启设备后错误消失。
  • 并不总是发生,一切正常,然后突然出现这个错误并破坏我的应用程序流程。
  • 当我的应用程序出现此错误时,其他应用程序如果使用 applicationDidBecomeActive 执行某些重要操作(如我所看到的 Facebook Messenger,它无法重置未读消息和徽章编号),也会面临相同的错误。

我相信这是一个iOS系统错误,有人可以确认吗?如果没有,我该如何解决?谢谢!

lifecycle ios appdelegate

5
推荐指数
1
解决办法
2440
查看次数