如何在 segue 中初始化 UIButton 的 titleLabel 字体?

Posted

技术标签:

【中文标题】如何在 segue 中初始化 UIButton 的 titleLabel 字体?【英文标题】:How to initialize a UIButton's titleLabel font in a segue? 【发布时间】:2013-12-18 12:41:06 【问题描述】:

我有两个UIViewControllers vc1vc2。第二个视图控制器有一个UIButton 属性originalButton

在从vc1vc2 的转场中,我复制了originalButton 用于动画目的(buttonCopy)。问题是buttonCopy 的titleLabel 的字体不是originalButton(标准UIButton 字体)。

显然这是因为在segue中originalButton的titleLabel还没有完全初始化。

在复制按钮之前调用NSLog(@"%@",originalButton.titleLabel.font) 的副作用是为titleLabel 设置了正确的字体,随后buttonCopy 将以正确的字体显示。

但是使用NSLog() 调用来初始化按钮的titleLabel 字体似乎很荒谬。必须有另一种方法来实现这一目标。怎么样?


编辑:这是我在自定义 segue 中复制原始按钮的代码:

- (void)perform 

    ...

    // load view to initialize button
    [destinationViewController view];

    // the following line fixes the problem due to side effects
    NSLog(@"%@",destinationViewController.originalButton.titleLabel.font);

    // copy buttons
    // (using NSKeyedArchiver because UIButton does not support the copy method)
    NSData *archivedData = [NSKeyedArchiver archivedDataWithRootObject: destinationViewController.originalButton];
    NSData *copy = [archivedData copy];
    UIButton *buttonCopy = [NSKeyedUnarchiver unarchiveObjectWithData:copy];

    ...


【问题讨论】:

您是否在-prepareForSegue:sender: 内进行复制?你能展示你的代码吗? 不,我在(自定义)segue 的 -perform 方法中制作副本。 【参考方案1】:

您可以用以下语句替换对NSLog 的调用:

[NSString stringWithFormat:@"%@", destinationViewController.originalButton.titleLabel.font];

这对加载字体有同样的效果,但不会输出任何日志消息。

【讨论】:

【参考方案2】:

您可以尝试像这样复制-prepareForSegue:sender: 上的按钮:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
  id vc2 = [segue destinationViewController];
  [vc2 setOriginalButton:[vc1Button copy]];

如果类是已知的,您可以用 VC 类名替换 id 并添加一个 * 来创建一个指针。

【讨论】:

这不起作用,因为即使在 执行 segue 之前(即在调用 -perform 之前)调用了 -prepareForSegue 方法。当按钮的 titleLabel 尚未在 -perform 方法中初始化时,之前尝试相同的事情是没有意义的。 -perform 在 VC1 还是 VC2 中? 既不是也不是。它在自定义 segue 类中(见上文)。

以上是关于如何在 segue 中初始化 UIButton 的 titleLabel 字体?的主要内容,如果未能解决你的问题,请参考以下文章

如何取消连接到 UIButton 的 segue

ios - 将一个 UIButton 连接到 2 个 segues

由于 UIButton segue,如何切换 UITabBars?

如何通过 segue 到下一个 ViewController 使“查看全部”按钮显示数据?

从 UITableViewCell 中的 UIButton 触发 Segue

一个UIButton两个场景只有一个segue,需要条件代码