【问题标题】:Passing NSDate to a local UIWebView in iOS - Objective C将 NSDate 传递给 iOS 中的本地 UIWebView - Objective C
【发布时间】:2017-02-13 07:15:24
【问题描述】:

我有一个带有菜单的应用程序,它加载从本地 HTML 文件加载的各种 UIWebViews。 (此代码在 WebViewController 中)

//Code for the WebView
vesperswebview.scrollView.bounces = NO;
[[vesperswebview scrollView] setBounces:NO];
[(UIScrollView*)[vesperswebview.subviews objectAtIndex:0] setShowsVerticalScrollIndicator:NO];

NSString *path = [[NSBundle mainBundle] pathForResource:@"index" ofType:@"html" inDirectory:@"data/html"];
NSURL *url = [NSURL fileURLWithPath:path];
NSString *theAbsoluteURLString = [url absoluteString];
NSString *queryString = @"#?manifest=Psalmody-Morning";
NSString *absoluteURLwithQueryString = [theAbsoluteURLString stringByAppendingString:queryString];
NSURL *finalURL = [NSURL URLWithString:absoluteURLwithQueryString];

NSURLRequest *request = [NSURLRequest requestWithURL:finalURL cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:(NSTimeInterval)10.0];
[vesperswebview loadRequest:request];

我还有一个名为 FlatDate Picker 的自定义日期选择器:(此代码在我的主 ViewController 中),它链接到我从 GitHub 获得的导入的 FlatDatePicker 开源项目。

- (void)flatDatePicker:(FlatDatePicker*)datePicker dateDidChange:(NSDate*)date {
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
    NSCalendar *coptic = [[NSCalendar alloc] initWithCalendarIdentifier:@"coptic"];
    [dateFormatter setCalendar:coptic];
    [dateFormatter setDateStyle:NSDateFormatterLongStyle];

    if (datePicker.datePickerMode == FlatDatePickerModeDate) {
        [dateFormatter setDateFormat:@"EEEE, MMMM, dd, yyyy"];
    } else if (datePicker.datePickerMode == FlatDatePickerModeDate) {
        [dateFormatter setDateFormat:@"HH:mm:ss"];
    } else {
        [dateFormatter setDateFormat:@"EEEE, MMMM, dd, yyyy HH:mm:ss"];
    }
    NSString *value = [dateFormatter stringFromDate:date];
    self.labelDateSelected.text = value;
}

我的问题是,当我在主视图控制器中选择日期时,如何保存该日期并将其传递到下一个视图以在我的数据库中加载 日期敏感 的适当 Javascript ?

【问题讨论】:

  • 有很多方法可以实现这一点。 1)在WebViewController中定义一个变量dateString,在用户选择日期并推送WebViewController时设置。 2) 如果您总是显示两个 ViewController,那么一旦用户点击 DatePicker,就使用委托模式更新 WebViewController。 developer.apple.com/library/content/documentation/General/….
  • 我已经阅读了您多次链接的文档,并且几个月来我一直遇到这个问题,您介意直接提供代码吗?你会让我的生活哈哈大笑
  • 那么我需要更多关于你的实现的信息。就像我说的那样,我几乎没有假设您如何显示 WebViewController,您是否允许用户首先选择日期。然后推送 WebViewController 并显示 HTML。
  • 实际上您将NSDate 文本值存储在self.labelDateSelected.text 中。在WebViewController 中创建一个NSDate 变量,比如说NSDate *jsDate。在您推送或呈现WebViewController 之前分配此值。从self.labelDateSelected.text 创建日期。在WebViewControllerviewDidLoad 中,使用值为jsDate 的查询从数据库中获取javascript。
  • 分享项目(demo也可以)会编辑发给你。

标签: javascript ios objective-c uiwebview nsdate


【解决方案1】:

鉴于 FlatDatePicker 的外观,从中获取的日期可以转换为以下 JavaScript DateFormats

ISO 日期“2015-03-25”(国际标准)

短日期“03/25/2015”或“2015/03/25”

长日期“2015 年 3 月 25 日”或“2015 年 3 月 25 日”

NSDate 转换为这些格式。可以做到以下几点

NSDateFormatter *ISODateFormatter = [[NSDateFormatter alloc] init];
[ISODateFormatter setDateFormat:@"yyyy-mm-dd"];
    
NSDateFormatter *ShortDateFormatter = [[NSDateFormatter alloc] init];
[ShortDateFormatter setDateFormat:@"yyyy/mm/dd"];
    
NSDateFormatter *LongDateFormatter = [[NSDateFormatter alloc] init];
[LongDateFormatter setDateFormat:@"dd MMM yyyy"];
    
NSString *ISODate = [ISODateFormatter stringFromDate:date];
NSString *ShortDate = [ShortDateFormatter stringFromDate:date];
NSString *LongDate = [LongDateFormatter stringFromDate:date];

您可以将此日期保存在selectedDate 变量中。然后,您可以像这样在UIViewController 中拥有一个初始化属性

@interface JSViewController ()

@property (nonatomic, strong) NSString *currentDate;

@end

-(instancetype)initWithDate:(NSString *)jsDate {
     self = [super initWithNibName:NULL bundle:NULL];
     if (self) {
       _currentDate = jsDate;
     }
     return self;
 }

您可以通过以下方式从另一个ViewController 初始化和启动此ViewController

JSViewController *jsVC = [[JSViewController alloc] initWithDate:ISODate];
[self presentViewController:jsVC animated:YES completion:nil];

试试这个。如果它不起作用,请随时 ping 我。随时提出修改建议以使其变得更好。

【讨论】:

    【解决方案2】:

    使用stringByEvaluatingJavaScriptFromString(使用UIWebView 时)或evaluateJavaScript:completionHandler:(使用WKWebView 时)调用一个JavaScript 函数,该函数将设置您加载的html 的日期。

    如果您使用 Segues 从您的 ViewController 显示 WebViewController,您可以使用 prepareForSegue 将日期从一个传递到另一个:

    - (void)prepareForSegue: (UIStoryboardSegue *)segue sender: (id)sender {
        // Make sure your segue name in storyboard is the same as this line
        if ([[segue identifier] isEqualToString: @"SEGUE_NAME"]) {
            // Get reference to the WebViewController
            WebViewController *vc = [segue destinationViewController];
    
            // Pass the date to the WebViewController
            [vc setSelectedDate: mySuperAwesomeDate];
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-03-10
      • 2013-08-30
      • 2016-03-01
      • 2016-07-15
      • 1970-01-01
      • 2011-10-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多