问题标签 [initwithcoder]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
523 浏览

ios - initWithCoder:自定义视图 - 确定正在实例化的视图控制器

我已经准备了一个带有关联 Xib 文件的自定义 UIView 子类。在情节提要上,我放置了一个 UIView 并将它的类设置为我的自定义子类。在自定义视图的 initWithCoder: 方法中,我加载 xib 并初始化子视图。这很好用。

现在我想在其他地方使用相同的自定义视图,但我希望我的子视图的布局有所不同。我想在同一个 Xib 文件中创建第二个自定义视图布局,并根据我的哪个视图控制器包含自定义视图加载正确的布局。由于我所有的子视图和所有逻辑都是相同的,只是布局不同,我正在寻找这样的东西:

有什么方法可以访问有关正在实例化此自定义视图的视图控制器的信息?

0 投票
1 回答
161 浏览

singleton - 让单例使用 initWithCoder 中的值,而不是在 Swift 中创建新实例

我在一个函数中有一个简单的布尔变量,在它上面设置了一个观察者来检查它何时发生变化:

我在 init 中将其设置为 false,然后在程序中将其设置为 true:初始化器被调用两次,一次用于类,一次用于子类,但我总是检查类中的值。所以我看到观察者中的变量设置为true,但是当我在另一个函数中检查它时,我发现它为false,而观察者不再被调用。

当它出现时,问题似乎源于我初始化了两次类的事实:一次是单例,另一次是:

当然,我用以下方式初始化单例:

如何返回从 initWithCoder 生成的值而不是创建一个新值?

0 投票
0 回答
442 浏览

xcode8 - XCode8 initWithCoder 帧大小

发现如果使用 XCode 8 XIB 文件,UIView initWithCoder 将获取帧 (0, 0, 1000, 1000) 而不是 XIB 帧大小设置。

检查它将添加的 XIB xml 文件的差异

并删除矩形框设置,例如

删除矩形框架设置是在 initWithCoder 中获得宽度 1000 和高度 1000 的主要原因。

因此,任何相关的尺寸计算,我们都需要在layoutSubviews.

0 投票
1 回答
91 浏览

ios - 在 initWithCoder 上查看 1000x1000:

有几个问题在 SO 上提出这个问题,但没有人正确地提出这个问题。

我正在使用一个自定义进度条,它是UIView具有此实现的基于类。

我已经创建了一个UIView200x20 点的界面构建器,并将该视图分配给MCProgressBarView我正在使用的这个自定义类。当应用程序运行时,initWithCoder运行并创建一个大小为 1000x1000 点的进度视图,不管视图在 IB 上的大小。

如何强制 initWithCoder 以在 IB 上分配的正确大小运行?

注意:我不想将它硬连接到 200x20,也不想在运行时通过代码设置它。有没有办法使这项工作?

0 投票
0 回答
108 浏览

xcode - 从 initWithCoder 访问自定义视图的用户定义运行时属性

我在 XIB 中有一个自定义视图类的实例,我需要通过调用采用某些参数的自定义初始化程序来对其进行初始化。为了在接口生成器中配置这些,我需要以某种方式将这些参数传递给初始化程序,即initWithCoder我可以将其重定向到正确的初始化程序。

所以我认为用户定义的运行时属性非常适合这个,但是找不到任何关于如何从传递给initWithCoder.

有谁知道如何做到这一点,或者有另一种方法可以初始化一个自定义(第三方)视图类,该类具有来自 XIB 的自己的自定义初始化方法?我可以稍微调整一下课程,但我不想重写它。

更新:我最终只是将类修改为具有单独的setup方法,而不是在初始化程序中进行所有设置,这使事情变得容易得多。但是,我仍然很好奇这是否可能以另一种方式进行。

0 投票
1 回答
264 浏览

macos - InitWithCoder 从未调用基于 Cocoa NSView 的类

我创建一个XIB.

我创建了这个名为的类MyCustomView并将其分配给XIB's File Owner。

NSView我在主应用程序上创建了一个。

我将该视图更改为MyCustomView.

我运行应用程序。MyCustomViewinitWithCoder不运行。initWithFrame不运行。awakeFromNib不运行。

什么都没发生。

有任何想法吗?

0 投票
2 回答
3046 浏览

ios - ios:关于 init(frame:) 和 init?(coder:) 的问题

init(frame:)Apple 的教程描述了和init?(coder:)as之间的区别

您通常通过以下两种方式之一创建视图:以编程方式初始化视图,或允许情节提要加载视图。每种方法都有一个相应的初始化程序: init(frame:)用于以编程方式初始化视图和 init?(coder:)从情节提要加载视图。您将需要在自定义控件中实现这两种方法。在设计应用程序时,Interface Builder 会在您将视图添加到画布时以编程方式将其实例化。在运行时,您的应用会从情节提要中加载视图。

我对“以编程方式初始化”和“由情节提要加载”的描述感到非常困惑。假设我有一个UIView被调用的子类MyView,“以编程方式初始化”是否意味着我编写代码来添加一个实例,MyView例如:

虽然init?(coder:)Main.storyboard我从对象库中拖动一个UIView然后在身份检查器中将其类设置为MyView

此外,在我的 xcode 项目中,这两种方法最终得到了不同的模拟器布局和Main.storyboard相同的代码: 在此处输入图像描述

为什么他们的行为不同?(我从对象库中拖动一个UIView并将其类设置为 RecordView)

0 投票
1 回答
45 浏览

objective-c - 如何使用故事板、initWithCoder、viewDidLoad 和 viewDidLayoutSubviews 有效地管理屏幕尺寸更改和重绘?

我正在使用情节提要布局来设置视图布局。

我同时支持 iPhone 和 iPad 布局。

当使用 视图创建视图时initWithCoder:,它最初是使用我上次在 Interface Builder 中查看的设备的帧大小创建的。

如果我在界面生成器中使用 iPhone X 布局进行设计,然后在 iPad 上构建和运行,则视图最初是使用 iPhone X 屏幕尺寸创建的。然后viewDidLayoutSubviews:被调用,它将屏幕尺寸更新为正确的 iPad 尺寸。

  1. 子视图drawRect在 UIViews 内部使用来绘制视图图形。我这样做是为了可以通过代码更改图形颜色。我更改颜色变量,然后调用setNeedsDispay视图以使用CGGraphicsContext命令用新颜色重绘视图。

  2. 它还允许我以任何大小绘制任何图形图像。并且有很多图形,这意味着我不必在我的捆绑包中包含所有 1x、2x 和 3x 尺寸的不同图像。这一切都是动态绘制的。

  3. 其中一些图像是在视图加载时而不是在 Interface Builder 中布置的。所以我检查屏幕大小并相应地绘制按钮大小和位置。

发生的事情是,viewDidLoad被调用,它根据初始屏幕大小绘制图形。

然后viewDidLayoutSubviews被调用,我必须更新我放置的子视图的绘图,根据新的屏幕尺寸手动重新定位它们,然后调用drawRect它们。我觉得这对设备来说只是不必要的额外工作。

除此之外,viewDidLayoutSubviews由于其他原因而被调用,然后只是在 viewController 的初始加载时调整视图的大小。所以每次调用它都会重新绘制子视图,即使它们不需要它。

而且,如果我正在运行的设备与我在 Interface Builder 中使用的设备相同,它不会调用viewDidLayoutSubviews. 我不能让视图布局那里的子视图,因为不能保证它会被调用。

到目前为止,我的解决方案是创建一个变量来跟踪屏幕宽度。我将变量设置在viewDidLoad. 如果它以 iPhone X 大小创建视图,我的screenWidthTracker = 1125. 当viewDidLayoutSubviews被调用时,我将当前屏幕尺寸与 screenWidthTracker 进行比较。

如果视图改变了大小,它会发送一条消息来重绘视图。我作为子视图手动放置的任何视图都注册为侦听@“updateView”。

有没有更好的方法来管理这个?有没有一种方法只在屏幕尺寸发生变化而不是在更新其他子视图的位置时才被调用?我应该使用 viewDidAppear 吗?我觉得这在链条中为时已晚,我不希望用户看到按钮大小的更新。

0 投票
0 回答
259 浏览

ios - 由于未捕获的异常“NSGenericException”而终止应用程序,原因:“此编码器要求从 initWithCoder 返回替换的对象:”

我的 iOS 应用程序在 iOS 10 和更新版本中运行良好。但是,当我尝试在 iOS 版本 9.3.2 的 iPad mini 上运行我的应用程序时,应用程序崩溃了。

我正在尝试推送一个视图控制器,并且我正在为所有视图控制器使用情节提要。

这是我的推送视图控制器代码:

我得到这是控制台中的错误并且应用程序正在崩溃:

我的 Xcode 版本是 9.4.1,部署目标是 iOS 9.2。

我无法弄清楚是什么问题。已经为此花费了一整天。

0 投票
1 回答
45 浏览

core-data - 无法识别的选择器发送到实例 [Class initWithCoder: ]

出于实践原因,我正在使用 CoreData 制作一个小应用程序。我有一个带有游戏的类并且游戏有玩家。现在当我想访问我保存在我的 CoreData 中的最后一个游戏时,应用程序崩溃并且我收到以下错误(但代码正在编译):

MyApp[89980:1675908] -[Player initWithCoder:]: 无法识别的选择器发送到实例

所以我有一个:

  • 抽象类 GAME
  • Timer,它是GAME的子类
  • TIMER中 P1 和 P2 的播放器

dataModel 看起来像这样: 数据模型游戏 数据模型播放器 数据模型计时器

并且代码看起来像这样:

这是定时器的类 - 它从之前的设置中获取一个定时器对象

在我的 viewLastGamesView 中,我想查看我的最后一场比赛 - 这里发生了错误:

谢谢你的帮助!