ios - 设置 UISlider 更改的时间

标签 ios nsdate nsdateformatter uislider

每当 slider 移动时,我都在设置时间,我点击了此链接 Slider with real time in Label并使大部分工作正常,这是我目前正在处理的代码

//这段代码是检查系统设置是24小时制还是12小时制

NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setLocale:[NSLocale currentLocale]];
[formatter setDateStyle:NSDateFormatterNoStyle];
[formatter setTimeStyle:NSDateFormatterShortStyle];
NSString *dateString = [formatter stringFromDate:[NSDate date]];
NSRange amRange = [dateString rangeOfString:[formatter AMSymbol]];
NSRange pmRange = [dateString rangeOfString:[formatter PMSymbol]];
m_is24h = (amRange.location == NSNotFound && pmRange.location == NSNotFound);

这是 slider 代码

UISlider *slider = (UISlider *)sender;

NSUInteger numberOfSlots = 24*2 - 1; //total number of 30mins slots

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"h:mm a"];


NSDate *zeroDate;
NSString *amString = [[formatter AMSymbol]uppercaseString];
NSString *timeString = [[[NSString stringWithFormat:@"12:00"]stringByAppendingString:@" "]stringByAppendingString:amString];


if(m_is24h)
{
     zeroDate = [dateFormatter dateFromString:@"00:00"];
}
else
{
     zeroDate = [dateFormatter dateFromString:timeString];
}


NSUInteger actualSlot = roundf(numberOfSlots*slider.value);
NSTimeInterval slotInterval = actualSlot * 30 * 60;

NSDate *slotDate = [NSDate dateWithTimeInterval:slotInterval sinceDate:zeroDate];
[dateFormatter setDateFormat:@"h:mm a"];

m_timeLabel.text = [[dateFormatter stringFromDate:slotDate]uppercaseString];

我在印度地区测试了这段代码,24 小时制和 12 小时制都工作正常。现在,当我将地区更改为日本或欧洲或任何其他地区时,移动 slider 时 24 小时制将不起作用,但是如果我将格式从设置更改为 12 小时,它会起作用,我不明白我在这里犯了什么错误。

最佳答案

我认为您将所做的事情过于复杂化了。您不需要使用基于用户使用的 12 或 24 小时格式的字符串为插槽创建日期,您可以只使用 NSDate 并让格式化程序适本地显示日期。

@interface ViewController ()
@property (weak, nonatomic) IBOutlet UILabel *timeLabel;
@property (weak, nonatomic) IBOutlet UISlider *slider;
@property (strong, nonatomic) NSDateFormatter *formatter;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    self.formatter = [NSDateFormatter new];
    [self.formatter setLocale:[NSLocale currentLocale]];
    [self.formatter setDateStyle:NSDateFormatterNoStyle];
    [self.formatter setTimeStyle:NSDateFormatterShortStyle];

    // Lazy way to set up the initial time
    [self sliderMoved:self.slider];

}

#pragma mark - Actions

- (IBAction)sliderMoved:(UISlider *)sender {
    NSUInteger slot = sender.value;
    NSDate *slotDate = [self timeFromSlot:slot];
    self.timeLabel.text = [self.formatter stringFromDate:slotDate];
}


#pragma mark - Private methods

/**
 Converts a slot integer to a valid time in 30 minute increments

 @param slot The slot number

 @return An NSDate for the time representing the slot

 @warning slot should be between 0 and 47
 */

- (NSDate *)timeFromSlot:(NSUInteger)slot{
    if ((slot > 47)) {
        return nil;
    }

    NSDateComponents *components = [NSDateComponents new];
    [components setMinute:30 * slot];

    return [[NSCalendar currentCalendar] dateFromComponents:components];
}

@end

这是完成您似乎想要的操作的完整 View Controller 实现。完整的项目是 available here如果您不想自己创建测试项目。

关于ios - 设置 UISlider 更改的时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22861488/

相关文章:

ios - 如何更改 Xcode 8 中选项卡栏图标的高亮颜色?

iphone - 将 iphone 中当前日期的纪元时间转换为小时前、分钟前

iphone - iOS - 解析不同格式的日期

IOS:获取具有特定(非本地化)格式的当前日期/时间

ios - 适用于 iO 的 Crittercism SDK 版本 2.3.5

ios - 数据库方案表

ios - NSDate 与 NSDateFormatter 返回 nil 日期

swift - 如何仅在 12 :00 PM in Swift 之前获取时间

ios - iOS 中的多个本地通知

ios - 使用didPressRightButton()(SlackTextViewController)时的Swift 3错误