how do I link a button to the webview of another controller having a link that changes based on the cell pressed? - xcode8

I have a button that needs to open a web view on another controller in modally. currently the button executes the code you see below. I would like the button to open the webview directly. the link changes because it is an rss reader and therefore, based on the cell pressed, changes the link of the button that must open the webview.
this is the code that manages the controller that appears after the cell has been pressed
class FeedItemWebViewController: UIViewController, UIWebViewDelegate {
#IBOutlet weak var textView: UITextView!
var link: String? = nil
var descriptionTesto:String? = nil
override func viewDidLoad() {
super.viewDidLoad()
self.textView.text = descriptionTesto
}
#IBAction func apri(_ sender: UIBarButtonItem) {
guard let url = URL(string: self.link ?? "") else { return }
UIApplication.shared.open(url, options: [:], completionHandler: nil)
}
}
here is where it manages the controller where I entered the webview
class OpenSafariController: UIViewController, UIWebViewDelegate {
#IBOutlet weak var myWebView: UIWebView!
override func viewDidLoad() {
super.viewDidLoad()
}
#IBAction func ritornaLista(_ sender: UIBarButtonItem) {
self.presentingViewController?.presentingViewController?.dismiss(animated: false, completion: nil)
}
}

delete the webview controller that is not needed. import SafariServices. here is the code to put on the button
#IBAction func apri(_ sender: UIBarButtonItem) {
let svc = SFSafariViewController(url: URL(string: self.link ?? "")!)
self.present(svc, animated: true, completion: nil)
}

Related

Xib not showing up in view

I have a Xib file trying to set it up with my storyboard. Everything in the Xib file is fine, but for some reason, it's not showing. I imported a file from GitHub which is set to my Xib, it's in Objective-C and I set the bridging, no errors. But when I run it nothing shows its blank. Did I not set something in the View Controller? Everything is done programmatically and I just set the class in storyboard.
Screenshot of storyboard:
What the simulator gives me when I push to the ViewController:
This is what I'm supposed to see:
What I am trying to implement -
https://github.com/jberlana/JBCroppableView
My XIB class
import UIKit
class CropViewXIB: UIView {
#IBOutlet weak var ImageView: JBCroppableImageView!
#IBAction func SubAction(_ sender: Any) {
ImageView.removePoint()
}
#IBAction func AddAction(_ sender: Any) {
ImageView.addPoint()
}
#IBAction func UndoAction(_ sender: Any) {
ImageView.reverseCrop()
}
#IBAction func CropAction(_ sender: Any) {
ImageView.crop()
}
override init(frame: CGRect) {
super.init(frame: frame)
commomInit()
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
commomInit()
}
private func commomInit(){
Bundle.main.loadNibNamed("CropViewXIB", owner: self, options: nil)
self.addSubview(ImageView)
ImageView.frame = self.bounds
ImageView.autoresizingMask = [.flexibleHeight, .flexibleWidth]
}
}
my view controller
import UIKit
class ViewController: UIViewController {
#IBOutlet weak var cropView: CropViewXIB!
override func viewDidLoad() {
super.viewDidLoad()
}
}
The issue is that you didn't actually get the parent view for your UINib object.
Bundle.main.loadNibNamed("CropViewXIB", owner: self, options: nil)
The line above returns an [Any] in your case you aren't even using the view that it is returning. so the idea is to get the first object from it and cast it as UIView such as:
Bundle.main.loadNibNamed("CropViewXIB", owner: self, options: nil)?.first as? UIView
Personally this is how I interact with a Nib. I create a view property of type UIView that can be referred as the parent view for the nib, and all subviews get added to it instead of self.
Something like this:
final class SomeNibView: UIView {
public var view: UIView!
private func setup() { // called to the initializer
// grab the views from loadNibNamed
guard let _view = Bundle.main.loadNibNamed("name", owner: self, options: nil)?.first as? UIView else { return }
// set it to our view property
view = _view
// add this property to the nib subview aka self
addSubview(view)
view.autoresizingMask = [.flexibleWidth, .flexibleHeight]
}
private func addMulitpleSubviews() {
// instead of doing self.addSubview(....) when it comes to add other subviews
// you'll do this view.addSubview(....)
}
}
Try to load xib using programming not using storyboard.
override func viewDidLoad()
{
super.viewDidLoad()
guard let yourXIB = Bundle.main.loadNibNamed("CropViewXIB", owner: self, options: nil)?.first as? CropViewXIB else { return}
self.view.addSubview(yourXIB)
}

Communication between view controllers, not able to pass on the data to the outlet of second view controller

Two view controllers:
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if (sender as! cell1).name.text == "ww"{
let s = segue.destination as! DetailViewController
s.detail?.text = "wwwwwwwwwww"
}
}
I am new to coding. What I am trying here is to communicate between view controllers. For some reason, I am not able to show the wwwwwwwwwww in the label of the second view controller
At the prepare function the view hasn't been loaded yet from storyboard, so the outlets of the DetailViewController are still nil.
Create a public variable in the DetailViewController which will be available at prepare, then in the viewDidLoad method of DetailViewController you can set the label's text to be the content of that variable.
class DetailViewController: UIViewController {
var text: String?
override function viewDidLoad() {
super.viewDidLoad()
label.text = text
}
}
Then in your list viewcontroller set the text property of detail vc:
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
guard (sender as! cell1).name.text == "ww",
let detailVc = segue.destination as? DetailViewController
else { return }
detailVc.text = "wwwwwwwwwww"
}

How Can I Refresh The Background Theme?

I Will Going Done Two Things On It.
First set Theme colour On All VC and second changing my currency from INR TO USD or vice versa.
I Have This View Controller named As Settings VC.
1) I am going to change the theme of the VC
2) It will changed but for that I need to go back from this view controller. It Will Never changed Here Automatically.
3) Can Anyone Help me For this to change it here automatically without navigating any other VC?
Here I Is My Code...
import UIKit
class SettingsVC: UIViewController {
#IBOutlet weak var themeColorSeg: UISegmentedControl!
#IBOutlet weak var Currency: UISegmentedControl!
override func viewDidAppear(_ animated: Bool){
setThemeOnVC(View: self.view)
}
override func viewDidLoad() {
super.viewDidLoad()
themeColorSeg.selectedSegmentIndex = getTheme()
Currency.selectedSegmentIndex = getCurrency()
}
#IBAction func saveAction(_ sender: Any) {
setTheme(themeCode: themeColorSeg.selectedSegmentIndex)
setCurrency(CurrencyCode: Currency.selectedSegmentIndex)
navigationController?.present(Utilities().configPopup(title: "Saved", message: "Settings Seved Successfully!"), animated: true, completion: nil)
}
}
Check Video Here
on saveAction, add below line too
setThemeOnVC(View: self.view)

I can't use touchesBegan/Moved/Ended and a UITapGestureRecognizer

Is it not possible to use both of these at the same time. Originally, I have overriden (Swift) touchesBegan/Moved/Ended in my ViewController.
Now, I'm wanting to add a TapGestureRecognizer to certain views under a certain situation, but the selector/action never gets fired.
class ViewController: UIViewController, UIGestureRecognizerDelegate {
...
func addTapGesturesOnNumberPadDisplay() {
if tapGestureRecognizerNumberPadView == nil {
tapGestureRecognizerNumberPadView = UITapGestureRecognizer(target: self, action: "handleTap:")
tapGestureRecognizerNumberPadView!.delegate = self
self.numberViewDone?.addGestureRecognizer(tapGestureRecognizerNumberPadView!)
}
}
...
func handleTap(sender: UITapGestureRecognizer) {
//never hit
Is this not possible? Should I just implement my own tapping ability in touchesBegan since I'm overriding it anyway, or is there a way to also use a tapGestureRecognizer here?
Since you have overriden touchesBegan/Moved/Ended in viewcontroller it should not have any impact on tap gestures in other subviews. Ideally it should work. Please check code below, works as expected.
class ViewController: UIViewController, UIGestureRecognizerDelegate {
#IBOutlet weak var categoryScrollView: UIScrollView!
var customView: UIView!
var tapGestureRecognizerNumberPadView : UITapGestureRecognizer?
override func viewDidLoad() {
super.viewDidLoad()
customView = UIView()
customView.frame.origin = CGPointMake(50,50)
customView.frame.size = CGSizeMake(100, 100)
customView.backgroundColor = UIColor.blueColor()
self.view.addSubview(customView)
addTapGesturesOnNumberPadDisplay()
}
func addTapGesturesOnNumberPadDisplay() {
if tapGestureRecognizerNumberPadView == nil {
tapGestureRecognizerNumberPadView = UITapGestureRecognizer(target: self, action: "handleTap:")
tapGestureRecognizerNumberPadView!.delegate = self
self.customView?.addGestureRecognizer(tapGestureRecognizerNumberPadView!)
}
}
func handleTap(sender: UITapGestureRecognizer) {
print("handleTap")
}
override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
}
override func touchesMoved(touches: Set<UITouch>, withEvent event: UIEvent?) {
}
override func touchesEnded(touches: Set<UITouch>, withEvent event: UIEvent?) {
}
}
Please check is there any other gestures to 'numberViewDone' view.

Why isn't UIKeyboard appearing when I tap inside a UITextField in swift?

Is this something to do with swift?
I've set up a controller without any connection to another but it is instantiated using it's storyboard ID.
Associated class file:
import Foundation
import UIKit
class SignUpViewController : UIViewController, UITextFieldDelegate {
#IBOutlet weak var companyField: UITextField!
#IBOutlet weak var emailField: UITextField!
#IBOutlet weak var passwordField: UITextField!
override func viewDidLoad() {
super.viewDidLoad()
}
override func viewDidAppear(animated: Bool) {
super.viewDidAppear(animated)
}
#IBAction func loginButtonTapped(sender: UIButton) {
}
#IBAction func forgotPasswordButtonTapped(sender: UIButton) {
}
#IBAction func signUpButtonTapped(sender: UIButton) {
}
}
This is how I present the sign up controller:
#IBAction func signUpButtonTapped(sender: UIButton) {
let signUpViewController = self.storyboard?.instantiateViewControllerWithIdentifier("signUpViewControllerSB") as SignUpViewController
self.presentViewController(signUpViewController, animated: true, completion: nil)
}
I tap in any text field and get the flashing cursor but no keyboard appears.
What am I missing?
Prior to swift I could just add textfields, run simulator and the keyboard would pop up.
I'm sure I've done everything correctly.
Check these settings.Go to
iOS Simulator -> Hardware -> Keyboard->Toggle Software Keyboard
also
iOS Simulator -> Hardware -> Keyboard-> Uncheck Connect Hardware Keyboard