Как я использую UISegmentedControl для переключения представлений?

Функции Math.round () и .toFixed () предназначены для округления до ближайшего целого числа. Вы получите неверные результаты при работе с десятичными знаками и использовании метода «умножить и разделить» для Math.round () или параметра для .toFixed (). Например, если вы попытаетесь округлить 1,005, используя Math.round (1.005 * 100) / 100, вы получите результат 1, а 1,00 - .toFixed (2) вместо того, чтобы получить правильный ответ 1,01.

Вы можете использовать следующее для решения этой проблемы:

Number(Math.round(100 - (price / listprice) * 100 + 'e2') + 'e-2');

Добавьте .toFixed (2), чтобы получить два десятичных знака, которые вы хотели.

Number(Math.round(100 - (price / listprice) * 100 + 'e2') + 'e-2').toFixed(2);

Вы можете создать функцию, которая будет обрабатывать округление для вас:

function round(value, decimals) {
    return Number(Math.round(value + 'e' + decimals) + 'e-' + decimals);
}

Пример: https://jsfiddle.net/k5tpq3pd/36/

Альтернатива

Вы можете добавить функцию округления к числу, используя прототип. Я бы не советовал добавлять здесь .toFixed (), так как он возвращает строку вместо числа.

Number.prototype.round = function(decimals) {
    return Number((Math.round(this + "e" + decimals)  + "e-" + decimals));
}

и используйте его так:

var numberToRound = 100 - (price / listprice) * 100;
numberToRound.round(2);
numberToRound.round(2).toFixed(2); //Converts it to string with two decimals

Пример https://jsfiddle.net/k5tpq3pd/35/

Источник: http://www.jacklmoore.com/notes/rounding-in-javascript/

82
задан Anbu.Karthik 4 October 2016 в 10:23
поделиться

3 ответа

Самый простой подход состоит в том, чтобы иметь два представления, которые можно переключать, чтобы указать, какой вид был выбран. Вот пример кода того, как это можно сделать, определенно не оптимизированный способ обработки представлений, а просто демонстрация того, как вы можете использовать UISegmentControl для переключения видимого представления:

- (IBAction)segmentSwitch:(id)sender {
  UISegmentedControl *segmentedControl = (UISegmentedControl *) sender;
  NSInteger selectedSegment = segmentedControl.selectedSegmentIndex;

  if (selectedSegment == 0) {
    //toggle the correct view to be visible
    [firstView setHidden:NO];
    [secondView setHidden:YES];
  }
  else{
    //toggle the correct view to be visible
    [firstView setHidden:YES];
    [secondView setHidden:NO];
  }
}


Вы, конечно, можете дополнительно изменить коэффициент кода, чтобы скрыть / показать правильный вид.

112
ответ дан 24 November 2019 в 09:08
поделиться

Одна из идей состоит в том, чтобы представление с сегментированными элементами управления имело представление контейнера, которое вы заполняете различными подпредставлениями (добавляйте как единственное подпредставление представления контейнера, когда сегменты переключаются). У вас даже могут быть отдельные контроллеры представления для этих подпредставлений, хотя вы должны пересылать важные методы, такие как «viewWillAppear» и «viewWillDisappear», если они вам нужны (и им нужно будет сообщить, под каким контроллером навигации они находятся).

Как правило, это работает очень хорошо, потому что вы можете разместить основное представление с контейнером в IB, а вложенные представления будут заполнять все пространство, которое позволяет им контейнер (убедитесь, что ваши маски автоматического изменения размера настроены правильно).

7
ответ дан 24 November 2019 в 09:08
поделиться

Арифметический сдвиг вправо сохранит знак при сдвиге числа со знаком :

11111111 (-1) will stay 11111111 (-1) 

Напротив, Логический сдвиг вправо не сохранит знак:

11111111 (-1) will become 01111111 (127)

Ваш код явно выполняет арифметический сдвиг, поэтому знаковый бит ( MSB ) повторяется. Действия оператора (>>) зависят от деталей реализации платформы, которую вы используете. В большинстве случаев это арифметический сдвиг.

Также обратите внимание, что 11111111 может иметь два разных значения в зависимости от представления. Это также влияет на способ их сдвига.

  • Если без знака, 11111111 представляет 255. Сдвиг вправо не сохранит знак, поскольку MSB не является битом знака.
  • Если подписано, 11111111 представляет -1.
17
ответ дан 24 November 2019 в 09:08
поделиться