【问题标题】:Data from DetailViewController not displayingDetailViewController 中的数据未显示
【发布时间】:2013-09-09 07:45:37
【问题描述】:

我正在我正在开发的应用程序中制作化学计算器部分,但我无法获取数据,也无法获取正确填充屏幕的信息。还有一个次要问题,对齐,如果有人可以帮助我,我将不胜感激,但这不是这个问题的主要焦点 - 我会为此专门制定一个主题。

所以我会回顾一下我想做的事情,以及我尝试过的事情。我要做的是制作一个化学计算器,根据选择的方程式,修改 UIStepper max/min.Value 以包括该方程式的所有可能推导,以及显示/隐藏的某些 UILabel 和 UITextField。

我已经确认我已经从 MasterViewController 传递了数据,因为我已经将数据设置为一个名为 _equation 的 NSString,并成功使用 _equation 修改了 viewDidLoad 中 self.title 下的 DetailViewController 的标题。

我尝试在 viewDidLoad 下的 if/if else 嵌套下适当地放置和初始化所有 UIStepper 属性(它还将 _equationName 可能值量化为整数 (eqNum),以便可以在 switch 语句中使用)。我也尝试将 UITextField 隐藏属性放在 viewDidLoad 下,但无济于事。

所以事不宜迟,让我们进入代码。我已将代码截断为一个等式,以便您可以更轻松地查看此处发生的情况 - 请注意,它嵌套在“计算”按钮的 IBAction 下:

// Take _equationName quantization and use it in a switch case to determine the formula that IBAction will use:
if (dflt)
{
    switch (eqNum)
    {
        case 1:
            if ((stepper.value = 1))
            {
                // Change deriv_units appropriately:
                deriv_units.text = @"Energy (Joules)";
                // This is a Planck's constant calculation, we hide the second variable as the constant
                // is stored:
                value2.hidden = YES;
                value2_type.hidden = YES;
                // Now we set up the parameters of the first entry variable:
                value1_type.text = @"Frequency (in Hz)";
                double frequency = [value1.text doubleValue];
                double Planck = 6.626069e-34;
                double energy = Planck * frequency;
                // Now we set up the return field to return results:
                NSString* resultIntermediate = [NSString stringWithFormat:@"%f", energy];
                result.text = resultIntermediate;
                units.text = @"J";
            }

以及viewDidLoad下的后续代码:

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    [self configureView];
    self.title = _equationName;
int eqNum;
if ((_equationName = @"Energy-Frequency Relation"))
{
    eqNum = 1;
    // Set stepper bounds for derivation:
    [stepper setMinimumValue:1];
    [stepper setMaximumValue:3];
    self.stepper.stepValue = 1;
    self.stepper.wraps = NO;
    self.stepper.autorepeat = NO;
    self.stepper.continuous = YES;
    // This is primarily a two-variable equation, so hide UITextView and UILabel #3:
    value3.hidden = YES;
    value3_type.hidden = YES;
} 

(向任何认识到这一点的人提供道具 - 这是普朗克的关系!:D)

以下是 GUI 的外观(在 Storyboard 中显示):

这是它在 iOS 模拟器中的样子:

注意错位问题,这不是这里的主要问题。 另请注意,现在,方程参数的 switch 语句位于 if 树下,该树检查 dflt(分配给 UISwitch 的布尔变量)是否为双精度计算返回 true。但是,在将开关切换到 ON 时,问题并不正确。

这里有一个更完整的解释:

  • value#.text 是在三个 UITextField 之一中输入的数字,从上到下。
  • value#_type 是要在对应的UILabel中显示的文本。
  • deriv_units 是标记为“Derivation Units”的 UILabel 下方的 UILabel,用于显示使用 UIStepper 选择了方程的哪个推导。
  • 在底部:最右边的 UILabel 是 result 标签,而最左边是 units 标签。

非常感谢任何可以帮助这位初级开发人员走上编程正义之路的人。

【问题讨论】:

  • 尝试使用断点来确保您的 if 和 switch 执行您期望它们执行的操作。

标签: ios objective-c uitextfield uilabel


【解决方案1】:

关于您的对齐问题:看起来您正在为 4 英寸屏幕创建情节提要,同时在 3.5 英寸屏幕上运行它。在故事板的右下方有一些小按钮,其中一个可让您在 4" 或 3.5" 显示之间立即切换。

您是否确保您的控件已连接到您的代码?

【讨论】:

  • 太棒了;固定的!我假设这是 3/3GS/4/4S 和 iPhone 5 屏幕尺寸之间的差异。关于主要问题的任何想法?
  • 是的(如果是这样,我会低下头并羞愧地逃跑)。现在我想一想,有可能我错误地将 UISwitch 或 UIStepper 连接到 IBOutlet,这显然不会使 dflt 语句为真并执行任何操作。让我检查一下;我会及时通知你。
  • 现在它已连接到 IBOutlet。是否需要链接到 IBAction?
  • IBOutlet 让您可以从代码访问 IB 中的对象; IBaction 使 IB 中的对象能够调用源代码中的代码。换句话说:IBOutlet 允许您在代码中更改对象(将其设置为隐藏,更改其框架或颜色,将其从超级视图中删除等),IBaction 只是一种将在 IB 中显示的方法,并且可能(不一定)作为对 IB 中控件的操作的结果而执行。所以我想你会希望你的 value3 连接到一个 IBOutlet,并将计算 btn 连接到一个 IBAction。
  • Calculate 按钮和双精度开关被路由到 IBActions,而其他一切都是 IBOutlet。
【解决方案2】:
- (void) viewDidAppear: (BOOL) animated{
    [super viewDidAppear: animated];
    // some rude NSAsserts, but let's be sure
    NSAssert(value1_type != nil, @"Your control element is nil, it might not be hooked up");
    // you should now see this text in the textfield
    value1_type.text = @"Frequency (in Hz)";

    NSAssert(result != nil, @"Your control element is nil, it might not be hooked up");
    result.text = @"some test text";

    NSAssert(units != nil, @"Your control element is nil, it might not be hooked up");
    units.text = @"J";
}

【讨论】:

  • 如何声明选择器?它向我抛出“UIViewController 没有可见的@interface 声明选择器'viewDidAppear'
  • 对不起,我把方法名弄错了。
  • 我添加了它,它给了我两件事:函数声明处的警告告诉我返回“void vs. id”存在冲突,其次在我进入 DetailViewController 时模拟它会引发错误.它似乎并不特别喜欢第一个 NSAssert。
猜你喜欢
  • 2013-05-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-23
  • 1970-01-01
  • 2017-07-15
  • 1970-01-01
相关资源
最近更新 更多