From 1229a6fafac826487c15acda1f26d1c0e5a81c15 Mon Sep 17 00:00:00 2001 From: Eliott hauteclair Date: Thu, 28 Dec 2017 15:06:28 +0100 Subject: [PATCH] Swift 4 Updated to Swift 4 Added Launch Screen Added iPhone X support --- .DS_Store | Bin 0 -> 6148 bytes SwiftBlog.xcodeproj/project.pbxproj | 36 +++++++- .../UserInterfaceState.xcuserstate | Bin 0 -> 26163 bytes .../xcschemes/xcschememanagement.plist | 14 ++++ SwiftBlog/AppDelegate.swift | 16 ++-- SwiftBlog/Base.lproj/Main.storyboard | 51 +++++++----- .../AppIcon.appiconset/Contents.json | 30 +++++++ SwiftBlog/Info.plist | 4 +- SwiftBlog/Launch Screen.storyboard | 51 ++++++++++++ SwiftBlog/TableViewController.swift | 78 +++++++++--------- SwiftBlog/WebviewPost.swift | 12 +-- 11 files changed, 212 insertions(+), 80 deletions(-) create mode 100644 .DS_Store create mode 100644 SwiftBlog.xcodeproj/project.xcworkspace/xcuserdata/eliotthauteclair.xcuserdatad/UserInterfaceState.xcuserstate create mode 100644 SwiftBlog.xcodeproj/xcuserdata/eliotthauteclair.xcuserdatad/xcschemes/xcschememanagement.plist create mode 100644 SwiftBlog/Launch Screen.storyboard diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..1a28423fc342683d71daac540e6f7b8e606c4edf GIT binary patch literal 6148 zcmeHK%Sr=55Ukc50$u`MJkA#g`GaAJko*3CkZ4pQS%PAYd-F^E533)_l2!2JLA#;5 zW_!D4*g9-a1CZuG1_H4E3nPbLO zAQeajJ{8daL!m3yz~0e*9Sk-C5GPEVac#2%v1o!=1A9kiXyR0&Qzb?WaXRxQ>S|!` z=yZsk%zffyi3vsQbmohdBX9ezL&j9#Sb=7(wPK>RVm@dqz8KUMUGsen>>Z8HywQny5l~&yQi0!4;2rb* BBennl literal 0 HcmV?d00001 diff --git a/SwiftBlog.xcodeproj/project.pbxproj b/SwiftBlog.xcodeproj/project.pbxproj index c7e977f..456ab23 100644 --- a/SwiftBlog.xcodeproj/project.pbxproj +++ b/SwiftBlog.xcodeproj/project.pbxproj @@ -13,6 +13,7 @@ AE17276719B8E32D00565259 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = AE17276619B8E32D00565259 /* Images.xcassets */; }; AE17278B19B8F48100565259 /* WebviewPost.swift in Sources */ = {isa = PBXBuildFile; fileRef = AE17278A19B8F48100565259 /* WebviewPost.swift */; }; AE17278D19B8F5C700565259 /* NavigationBarBackground.png in Resources */ = {isa = PBXBuildFile; fileRef = AE17278C19B8F5C700565259 /* NavigationBarBackground.png */; }; + C93BECD41FF52FB3001C1ECA /* Launch Screen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = C93BECD31FF52FB3001C1ECA /* Launch Screen.storyboard */; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ @@ -24,6 +25,7 @@ AE17276619B8E32D00565259 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; AE17278A19B8F48100565259 /* WebviewPost.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WebviewPost.swift; sourceTree = ""; }; AE17278C19B8F5C700565259 /* NavigationBarBackground.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = NavigationBarBackground.png; sourceTree = ""; }; + C93BECD31FF52FB3001C1ECA /* Launch Screen.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = "Launch Screen.storyboard"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -56,6 +58,7 @@ AE17275C19B8E32D00565259 /* SwiftBlog */ = { isa = PBXGroup; children = ( + C93BECD31FF52FB3001C1ECA /* Launch Screen.storyboard */, AE17275F19B8E32D00565259 /* AppDelegate.swift */, AE17276119B8E32D00565259 /* TableViewController.swift */, AE17278A19B8F48100565259 /* WebviewPost.swift */, @@ -101,7 +104,7 @@ AE17275219B8E32D00565259 /* Project object */ = { isa = PBXProject; attributes = { - LastUpgradeCheck = 0600; + LastUpgradeCheck = 0920; ORGANIZATIONNAME = "Patrick Balestra"; TargetAttributes = { AE17275919B8E32D00565259 = { @@ -134,6 +137,7 @@ files = ( AE17276519B8E32D00565259 /* Main.storyboard in Resources */, AE17276719B8E32D00565259 /* Images.xcassets in Resources */, + C93BECD41FF52FB3001C1ECA /* Launch Screen.storyboard in Resources */, AE17278D19B8F5C700565259 /* NavigationBarBackground.png in Resources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -173,20 +177,30 @@ CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; COPY_PHASE_STRIP = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; GCC_OPTIMIZATION_LEVEL = 0; GCC_PREPROCESSOR_DEFINITIONS = ( "DEBUG=1", @@ -199,11 +213,12 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 4.0; }; name = Debug; }; @@ -215,13 +230,21 @@ CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; @@ -229,15 +252,18 @@ ENABLE_NS_ASSERTIONS = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; GCC_WARN_UNDECLARED_SELECTOR = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + SWIFT_VERSION = 4.0; VALIDATE_PRODUCT = YES; }; name = Release; @@ -249,7 +275,9 @@ ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; INFOPLIST_FILE = SwiftBlog/Info.plist; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "com.giovannibalestra.$(PRODUCT_NAME:rfc1034identifier)"; PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 4.0; }; name = Debug; }; @@ -260,7 +288,9 @@ ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; INFOPLIST_FILE = SwiftBlog/Info.plist; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "com.giovannibalestra.$(PRODUCT_NAME:rfc1034identifier)"; PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 4.0; }; name = Release; }; diff --git a/SwiftBlog.xcodeproj/project.xcworkspace/xcuserdata/eliotthauteclair.xcuserdatad/UserInterfaceState.xcuserstate b/SwiftBlog.xcodeproj/project.xcworkspace/xcuserdata/eliotthauteclair.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000000000000000000000000000000000000..692351203ff107a61f4bffffd1e80a067694779d GIT binary patch literal 26163 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 kEA0^Lv$k?$< + + + + SchemeUserState + + SwiftBlog.xcscheme + + orderHint + 0 + + + + diff --git a/SwiftBlog/AppDelegate.swift b/SwiftBlog/AppDelegate.swift index dc98328..5c7962f 100644 --- a/SwiftBlog/AppDelegate.swift +++ b/SwiftBlog/AppDelegate.swift @@ -13,33 +13,31 @@ class AppDelegate: UIResponder, UIApplicationDelegate { var window: UIWindow? - - func application(application: UIApplication!, didFinishLaunchingWithOptions launchOptions: NSDictionary!) -> Bool { - - UIApplication.sharedApplication().statusBarStyle = UIStatusBarStyle.LightContent + func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey : Any]? = nil) -> Bool { + UIApplication.shared.statusBarStyle = .lightContent return true } - func applicationWillResignActive(application: UIApplication!) { + func applicationWillResignActive(_ application: UIApplication) { // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game. } - func applicationDidEnterBackground(application: UIApplication!) { + func applicationDidEnterBackground(_ application: UIApplication) { // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. } - func applicationWillEnterForeground(application: UIApplication!) { + func applicationWillEnterForeground(_ application: UIApplication) { // Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background. } - func applicationDidBecomeActive(application: UIApplication!) { + func applicationDidBecomeActive(_ application: UIApplication) { // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. } - func applicationWillTerminate(application: UIApplication!) { + func applicationWillTerminate(_ application: UIApplication) { // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. } diff --git a/SwiftBlog/Base.lproj/Main.storyboard b/SwiftBlog/Base.lproj/Main.storyboard index 22851ee..6977e8e 100644 --- a/SwiftBlog/Base.lproj/Main.storyboard +++ b/SwiftBlog/Base.lproj/Main.storyboard @@ -1,7 +1,12 @@ - - + + + + + - + + + @@ -9,22 +14,26 @@ - + - + + + - + - + @@ -103,12 +118,4 @@ - - - - - - - - diff --git a/SwiftBlog/Images.xcassets/AppIcon.appiconset/Contents.json b/SwiftBlog/Images.xcassets/AppIcon.appiconset/Contents.json index a396706..19882d5 100644 --- a/SwiftBlog/Images.xcassets/AppIcon.appiconset/Contents.json +++ b/SwiftBlog/Images.xcassets/AppIcon.appiconset/Contents.json @@ -1,19 +1,49 @@ { "images" : [ + { + "idiom" : "iphone", + "size" : "20x20", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "20x20", + "scale" : "3x" + }, { "idiom" : "iphone", "size" : "29x29", "scale" : "2x" }, + { + "idiom" : "iphone", + "size" : "29x29", + "scale" : "3x" + }, { "idiom" : "iphone", "size" : "40x40", "scale" : "2x" }, + { + "idiom" : "iphone", + "size" : "40x40", + "scale" : "3x" + }, { "idiom" : "iphone", "size" : "60x60", "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "60x60", + "scale" : "3x" + }, + { + "idiom" : "ios-marketing", + "size" : "1024x1024", + "scale" : "1x" } ], "info" : { diff --git a/SwiftBlog/Info.plist b/SwiftBlog/Info.plist index ac9b78c..0e7c01a 100644 --- a/SwiftBlog/Info.plist +++ b/SwiftBlog/Info.plist @@ -7,7 +7,7 @@ CFBundleExecutable $(EXECUTABLE_NAME) CFBundleIdentifier - com.giovannibalestra.$(PRODUCT_NAME:rfc1034identifier) + $(PRODUCT_BUNDLE_IDENTIFIER) CFBundleInfoDictionaryVersion 6.0 CFBundleName @@ -22,6 +22,8 @@ 1 LSRequiresIPhoneOS + UILaunchStoryboardName + Launch Screen UIMainStoryboardFile Main UIRequiredDeviceCapabilities diff --git a/SwiftBlog/Launch Screen.storyboard b/SwiftBlog/Launch Screen.storyboard new file mode 100644 index 0000000..1b82485 --- /dev/null +++ b/SwiftBlog/Launch Screen.storyboard @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/SwiftBlog/TableViewController.swift b/SwiftBlog/TableViewController.swift index 2df7cf6..7383ac0 100644 --- a/SwiftBlog/TableViewController.swift +++ b/SwiftBlog/TableViewController.swift @@ -15,9 +15,9 @@ class BlogPost { var date = String() } -class TableViewController: UITableViewController, NSXMLParserDelegate { +class TableViewController: UITableViewController, XMLParserDelegate { - var parser = NSXMLParser() + var parser = XMLParser() var blogPosts: [BlogPost] = [] var eName = String() @@ -28,28 +28,27 @@ class TableViewController: UITableViewController, NSXMLParserDelegate { override func viewDidLoad() { super.viewDidLoad() - - tableView.frame = CGRectMake(0, 0, 320, 568) - - navigationController.navigationBar.tintColor = UIColor.whiteColor() - navigationController.navigationBar.setBackgroundImage(UIImage(named: "NavigationBarBackground"), forBarMetrics: .Default) - navigationController.navigationBar.titleTextAttributes = [NSForegroundColorAttributeName:UIColor.whiteColor(), NSFontAttributeName:UIFont(name: "HelveticaNeue-Light", size: 18)] - navigationController.navigationBar.shadowImage = UIImage() + + navigationController?.navigationBar.tintColor = UIColor.white + navigationController?.navigationBar.setBackgroundImage(UIImage(named: "NavigationBarBackground"), for: .default) + navigationController?.navigationBar.titleTextAttributes = [NSAttributedStringKey.foregroundColor:UIColor.white, NSAttributedStringKey.font:UIFont(name: "HelveticaNeue-Light", size: 18)!] + navigationController?.navigationBar.shadowImage = UIImage() tableView.estimatedRowHeight = 100 tableView.rowHeight = UITableViewAutomaticDimension - var url: NSURL = NSURL.URLWithString("https://developer.apple.com/swift/blog/news.rss") - parser = NSXMLParser(contentsOfURL: url) + let url = URL(string: "https://developer.apple.com/swift/blog/news.rss") +// var url: URL = URL.URLWithString("https://developer.apple.com/swift/blog/news.rss")! + parser = XMLParser(contentsOf: url!)! parser.delegate = self parser.parse() - let contents = NSString(contentsOfURL: url, encoding: 0, error: nil) + //let contents = String.init(contentsOf: url!, encoding: String.Encoding(rawValue: 0)) +// let contents = String(contentsOf: url, encoding: 0, error: nil) } - func parser(parser: NSXMLParser!, didStartElement elementName: String!, namespaceURI: String!, qualifiedName qName: String!, attributes attributeDict: [NSObject : AnyObject]!) { - + func parser(_ parser: XMLParser, didStartElement elementName: String, namespaceURI: String?, qualifiedName qName: String?, attributes attributeDict: [String : String] = [:]) { eName = elementName if elementName == "item" { postTitle = String() @@ -59,7 +58,7 @@ class TableViewController: UITableViewController, NSXMLParserDelegate { } } - func parser(parser: NSXMLParser!, didEndElement elementName: String!, namespaceURI: String!, qualifiedName qName: String!) { + func parser(_ parser: XMLParser, didEndElement elementName: String, namespaceURI: String?, qualifiedName qName: String?) { if elementName == "item" { let blogPost: BlogPost = BlogPost() blogPost.title = postTitle @@ -70,8 +69,10 @@ class TableViewController: UITableViewController, NSXMLParserDelegate { } } - func parser(parser: NSXMLParser!, foundCharacters string: String!) { - let data = string.stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceAndNewlineCharacterSet()) + func parser(_ parser: XMLParser, foundCharacters string: String) { + let data = string.trimmingCharacters(in: NSCharacterSet.whitespacesAndNewlines) + //let data = string.stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceAndNewlineCharacterSet()) + if (!data.isEmpty) { if eName == "title" { postTitle += data @@ -80,44 +81,43 @@ class TableViewController: UITableViewController, NSXMLParserDelegate { } else if eName == "description" { descriptionText += data } else if eName == "pubDate" { - let dateFormatter = NSDateFormatter() + let dateFormatter = DateFormatter() dateFormatter.dateFormat = "EEE, dd LLL yyyy HH:mm:ss zzz" - dateFormatter.timeZone = NSTimeZone(abbreviation: "PDT") - let formattedDate = dateFormatter.dateFromString(data) + dateFormatter.timeZone = TimeZone(abbreviation: "PDT") + let formattedDate = dateFormatter.date(from: data) if formattedDate != nil { - dateFormatter.dateStyle = .MediumStyle; - dateFormatter.timeStyle = .NoStyle; - postDate = dateFormatter.stringFromDate(formattedDate!) + dateFormatter.dateStyle = .medium + dateFormatter.timeStyle = .none + postDate = dateFormatter.string(from: formattedDate!) } } } } - func parserDidEndDocument(parser: NSXMLParser!) { + func parserDidEndDocument(_ parser: XMLParser) { self.tableView.reloadData() } // MARK: - Table view data source - - override func numberOfSectionsInTableView(tableView: UITableView!) -> Int { + override func numberOfSections(in tableView: UITableView) -> Int { return 1 } - override func tableView(tableView: UITableView!, numberOfRowsInSection section: Int) -> Int { + override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return blogPosts.count } - override func tableView(tableView: UITableView!, cellForRowAtIndexPath indexPath: NSIndexPath!) -> UITableViewCell! { - let cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as UITableViewCell + override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { + let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as UITableViewCell let currentBlogPost: BlogPost = blogPosts[indexPath.row] - cell.textLabel.text = currentBlogPost.title - cell.detailTextLabel.text = currentBlogPost.description - cell.textLabel.numberOfLines = 0 - cell.detailTextLabel.numberOfLines = 1 + cell.textLabel?.text = currentBlogPost.title + cell.detailTextLabel?.text = currentBlogPost.description + cell.textLabel?.numberOfLines = 0 + cell.detailTextLabel?.numberOfLines = 1 - let dateLabel = UILabel(frame: CGRectMake(0, 0, 80, 25)) - dateLabel.textColor = UIColor.orangeColor() - dateLabel.textAlignment = .Right; + let dateLabel = UILabel(frame: CGRect(x: 0, y: 0, width: 80, height: 25)) + dateLabel.textColor = UIColor.orange + dateLabel.textAlignment = .right dateLabel.font = UIFont(name: "HelveticaNeue-Light", size: 12) dateLabel.text = currentBlogPost.date cell.accessoryView = dateLabel @@ -125,10 +125,10 @@ class TableViewController: UITableViewController, NSXMLParserDelegate { return cell } - override func prepareForSegue(segue: UIStoryboardSegue!, sender: AnyObject!) { + override func prepare(for segue: UIStoryboardSegue, sender: Any?) { if (segue.identifier == "post") { - let webView: WebviewPost = segue!.destinationViewController as WebviewPost - webView.blogPostURL = NSURL(string:blogPosts[tableView.indexPathForSelectedRow().row].link) + let webView: WebviewPost = segue.destination as! WebviewPost + webView.blogPostURL = URL(string:blogPosts[(tableView.indexPathForSelectedRow?.row)!].link) } } diff --git a/SwiftBlog/WebviewPost.swift b/SwiftBlog/WebviewPost.swift index cf71738..c6095cf 100644 --- a/SwiftBlog/WebviewPost.swift +++ b/SwiftBlog/WebviewPost.swift @@ -12,20 +12,20 @@ class WebviewPost: UIViewController, UIWebViewDelegate { @IBOutlet weak var webView: UIWebView! - var blogPostURL: NSURL = NSURL() + var blogPostURL: URL? = nil override func viewDidLoad() { - let request = NSURLRequest(URL: blogPostURL) + let request = URLRequest(url: blogPostURL!) webView.loadRequest(request) webView.sizeToFit() - UIApplication.sharedApplication().networkActivityIndicatorVisible = true; + UIApplication.shared.isNetworkActivityIndicatorVisible = true } @IBAction func openInSafari(sender: AnyObject) { - UIApplication.sharedApplication().openURL(blogPostURL) + UIApplication.shared.open(blogPostURL!, options: [:], completionHandler: nil) } - func webViewDidFinishLoad(webView: UIWebView!) { - UIApplication.sharedApplication().networkActivityIndicatorVisible = false; + func webViewDidFinishLoad(_ webView: UIWebView) { + UIApplication.shared.isNetworkActivityIndicatorVisible = false } }