Today Extension 有标题,但没有正文 iOS 8

Posted

技术标签:

【中文标题】Today Extension 有标题,但没有正文 iOS 8【英文标题】:Today Extension has a title, but no body iOS 8 【发布时间】:2014-06-09 20:01:15 【问题描述】:

我正在 ios 8 中试用新的TodayExtensions,并按照 WWDC 视频为 iOS 和 OS X 创建扩展,第 1 部分中所述的步骤创建了 Today Extension。我在提供的故事板中向 ViewController 添加了一个彩色 UIView。我在“今日”通知中心获得了一个标题,但我的彩色视图没有正文。看起来像这样(我做了两个):

还有其他人得到这个吗?我在我的所有 ViewControllers 方法中设置了断点,但没有调用任何内容。我将 Info.plist 更改为直接进入我的 VC 课程,而不是故事板,但我仍然一无所获。我可以在 info.plist 中更改今天扩展的标题。

【问题讨论】:

我发现有时调试器无法附加到设备上的小部件。您可以做的一件事(尽管很乏味)是在整个代码中设置 NSLog 语句并检查设备日志。您可以在 Xcode 中通过转到 Window > Organizer > Devices 然后在窗口底部附近看到一个小的展开图标来访问它。请注意,您可能会看到来自系统和/或其他应用程序的各种输出,因此您可能需要手动筛选这些输出以查看小部件的日志语句。 iOS 8 Beta Today extension widget not showing in a Swift app?的可能重复 检查您的崩溃日志。它实际上是崩溃 我发现唯一能让我在更改后看到我的 Today Extension 正文的方法是点击 iOS 模拟器的“Rest Content and Settings”选项。但是,如果您设置 preferredContentSize 设置,这将不起作用。我想我会等待 Beta 3 看看情况是否有所改善。 (今天发布了 Beta 3,情况好多了) 【参考方案1】:

首先,为了测试是否发生了任何事情,将 awakeFromNib 添加到您的视图控制器并设置首选内容大小(所有代码都在 Obj C 中):

- (void)awakeFromNib 
    [super awakeFromNib];
    [self setPreferredContentSize:CGSizeMake(self.view.bounds.size.width, 50)];

正如上面所说,注释掉默认的 init 方法并创建一个空的 initWithCoder: 以解决 Beta 2 中的一些错误:

-(id)initWithCoder:(NSCoder *)aDecoder

    self = [super initWithCoder:aDecoder];
    if (self) 
        // init
    
    return self;


//- (instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil 
//    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
//    if (self) 
//        // Custom initialization
//    
//    return self;
//

现在清理,然后再次运行。此时您应该会看到它调整大小(确保添加带有文本的标签或要测试的内容)。

确保使用普通的 UIViewController 类而不是子类进行测试。一旦你看到你的小部件大小响应,然后尝试一个子类。我今天花了一个小时才发现使用 UICollectionViewController 在 Beta 2 中根本不起作用(将提交 RADAR)。

【讨论】:

为我工作,很好的答案!这个bug真的很烦人。 设置preferredContentSize后,扩展的ViewController的视图高度在下次打开时会缩小,这是怎么回事?【参考方案2】:

如果您运行的是应用程序方案而不是小部件方案,首先要检查的是设备日志或模拟器日志。由于今天的视图是系统的一部分,而不是您在 Xcode 中调试的应用程序的一部分,因此您不会在 Xcode 控制台上的小部件视图控制器上看到错误。您可以在系统日志中查看模拟器的控制台:

如果小部件视图控制器发生崩溃,它将显示如下内容:

xxxxx.local Widget[43414]:由于未捕获而终止应用程序 异常'NSUnknownKeyException',原因:'[TodayViewController 0x7fd893d7ca60> setValue:forUndefinedKey:]: 这个类不是键 键标签的值编码兼容。'

如果您选择小部件目标,xcode 会将调试器附加到今天的视图小部件,如果您启用了“所有异常”断点,您将能够查看是否有异常以及在哪里上升。

【讨论】:

【参考方案3】:

注释掉原来的init方法:

//    init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?) 
//        super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
//        // Custom initialization
//    

添加这个初始化方法:

init(coder aDecoder: NSCoder!) 
   super.init(coder: aDecoder)
   // Custom initialization here

清理并构建您的项目。 确保您的小部件内容具有高度限制。

【讨论】:

【参考方案4】:

我在这方面有点挣扎。

然后我发现它试图使用 MainInterface.storyboard 中所有子视图的约束来推断视图的高度。

如果您将所有必要的约束添加到视图的子视图,则可以推断 Today Extension 的高度,您的视图将按您的意愿显示。

【讨论】:

这也是内容出现在我面前的原因。我必须有元素之间的垂直约束、元素的高度约束以及第一个元素的容器顶部和最后一个元素的容器底部的约束。如果没有完全明确的自动布局中的所有内容,它就无法计算出高度。 我试过这个,但它对我不起作用。为每个元素设置显式高度和宽度,以及它们与容器边框之间的显式间距。【参考方案5】:

我遇到了同样的问题,就像你遇到不同的问题一样。

1) 如果您经常从 Xcode 重新启动您的小部件,它会在手机上被杀死,并且系统似乎为此惩罚了您,在您在 Xcode 中杀死您的小部件之前始终关闭今天视图是个好主意,这样它就会得到“很好”结束而不是被 Xcode 杀死

解决方案: 有时唯一的解决办法是从今天的视图中删除小部件并阅读它(有时甚至从手机中删除应用程序并重新安装)

2) 我使用的是日志框架,每次我尝试将数据上传到服务器时,小部件都会冻结并且不再响应。然后,当我关闭通知中心并重新打开它时,我遇到了与您相同的问题,即今天的小部件为空或今天的高度为 0 小部件。

解决方案: 虽然不是一个好方法,不是从小部件代码上传数据......真正奇怪的是,在调试版本中一切正常,但在发布版本中却不行。

【讨论】:

以上是关于Today Extension 有标题,但没有正文 iOS 8的主要内容,如果未能解决你的问题,请参考以下文章

Dose NSTimer 可以在 Today Extension (Widget) 中使用吗?

Swift 在 App 和 Today Extension 之间共享 CoreData [重复]

Today Widget Extension 动画在 iOS 10 上不起作用

iOS Today Extension 中奇怪的 NSInternalInconsistencyException 和 PKService 崩溃

iOS Today Extension - 共享核心数据

iOS扩展Extension之Today