I have a Page Controller which the indicator Dots Disappeared! I wanted to disappear them Just In the Last Page !
I have Another Problem too
I want to move these dots +100 from bottom !
And my last question: which method can help me to write any method in any page in my page view controller ? ( I want to control all pages when the user saw that pages)
here is my code
class pageVC : UIPageViewController , UIPageViewControllerDataSource , UIPageViewControllerDelegate {
let pageVC = UIPageControl()
lazy var VCArr : [UIViewController] = {
return [self.VCInstance(name : "FirtsVC"),
self.VCInstance(name : "SecondVC"),
self.VCInstance(name :"ThirdVC"),
self.VCInstance(name :"FourthVC"),
self.VCInstance(name :"FivethVC")]
}()
private func VCInstance(name : String) -> UIViewController {
return UIStoryboard(name : "Main" , bundle : nil).instantiateViewController(withIdentifier: name)
}
override func viewDidLoad() {
super.viewDidLoad()
self.dataSource = self
self.delegate = self
if VCArr.first != nil {
print("first Page Reached!")
}
if let firstVC = VCArr.first {
setViewControllers([firstVC] , direction: .forward , animated: true, completion: nil)
}
}
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
let pageVC = UIPageControl()
for view in self.view.subviews {
if view is UIScrollView {
let pageControl = UIPageControl()
pageControl.pageIndicatorTintColor = UIColor.gray
pageControl.currentPageIndicatorTintColor = UIColor.white
pageControl.backgroundColor = UIColor.darkGray
pageControl.numberOfPages = VCArr.count
pageControl.center = self.view.center
self.view.addSubview(pageControl)
pageControl.layer.position.y = self.view.frame.height - 100;
}else if view is UIPageControl{
view.backgroundColor = UIColor.clear
pageVC.numberOfPages = 5
pageVC.center = self.view.center
pageVC.layer.position.y = self.view.frame.height - 180 ;
}
}
}
public func pageViewController(_ pageViewController: UIPageViewController, viewControllerBefore viewController: UIViewController) -> UIViewController?{
guard let viewControllerIndex = VCArr.index(of: viewController) else {
return nil
}
let previousIndex = viewControllerIndex-1
guard previousIndex >= 0 else {
return nil
}
guard VCArr.count > previousIndex else {
return nil
}
return VCArr[previousIndex]
}
public func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController?{
guard let viewControllerIndex = VCArr.index(of: viewController) else {
return nil
}
let nextIndex = viewControllerIndex+1
guard nextIndex < VCArr.count
else {
return nil
}
guard VCArr.count > nextIndex else {
return nil
}
if nextIndex == VCArr.count{
pageVC.isHidden = false
}
return VCArr[nextIndex]
}
public func presentationCount(for pageViewController: UIPageViewController) -> Int{
return VCArr.count
}
public func presentationIndex(for pageViewController: UIPageViewController) -> Int{
guard let firstViewController = viewControllers?.first , let firstViewControllerIndex = VCArr.index(of: firstViewController) else {
return 0
}
let firstIndex = firstViewControllerIndex - 1
guard firstIndex >= VCArr.count else {
return VCArr.count
}
return firstViewControllerIndex
}
public func pageViewController(_ pageViewController: UIPageViewController, didFinishAnimating finished: Bool, previousViewControllers: [UIViewController], transitionCompleted completed: Bool) {
if (VCArr.last!.isViewLoaded)
{
print("It is Done!!!")
}
}
}
here is the answer
class pageVC : UIPageViewController , UIPageViewControllerDataSource , UIPageViewControllerDelegate {
let pageVC = UIPageControl()
lazy var VCArr : [UIViewController] = {
return [self.VCInstance(name : "FirtsVC"),
self.VCInstance(name : "SecondVC"),
self.VCInstance(name :"ThirdVC"),
self.VCInstance(name :"FourthVC"),
self.VCInstance(name :"FivethVC")]
}()
private func VCInstance(name : String) -> UIViewController {
return UIStoryboard(name : "Main" , bundle : nil).instantiateViewController(withIdentifier: name)
}
override func viewDidLoad() {
super.viewDidLoad()
self.dataSource = self
self.delegate = self
let launchedBefore = UserDefaults.standard.bool(forKey: "launchedBefore")
if launchedBefore {
print("Not first launch!")
print("Should Launch MainTabBarController!")
/////Not First Time launch! reach mainTabBarController//////////
} else {
print("First launch, setting UserDefault.")
UserDefaults.standard.set(true, forKey: "launchedBefore")
}
//////Lock Rotation/////////
var shouldAutorotate: Bool {
return false
}
var supportedInterfaceOrientations: UIInterfaceOrientationMask {
return .portrait
}
func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
let value = UIInterfaceOrientation.portrait.rawValue
UIDevice.current.setValue(value, forKey: "orientation")
UIViewController.attemptRotationToDeviceOrientation()
}
func supportedInterfaceOrientations() -> UIInterfaceOrientationMask {
return [UIInterfaceOrientationMask.portrait ]
}
///////Lock Roration//////
if VCArr.first != nil {
print("first Page Reached!")
}
if let firstVC = VCArr.first {
setViewControllers([firstVC] , direction: .forward , animated: true, completion: nil)
}
}
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
let view = self.pageVC.currentPage
for view in self.view.subviews {
if view is UIScrollView {
let pageVC = UIPageControl()
self.pageVC.pageIndicatorTintColor = UIColor.lightText
self.pageVC.currentPageIndicatorTintColor = UIColor.white
self.pageVC.backgroundColor = UIColor.white
self.pageVC.numberOfPages = VCArr.count
self.pageVC.center = self.view.center
self.view.addSubview(self.pageVC)
pageVC.layer.position.y = self.view.frame.height - 150;
}else if view is UIPageControl{
view.backgroundColor = UIColor.clear
pageVC.numberOfPages = 5
pageVC.center = self.view.center
pageVC.layer.position.y = self.view.frame.height - 100 ;
}
}
}
public func pageViewController(_ pageViewController: UIPageViewController, viewControllerBefore viewController: UIViewController) -> UIViewController?{
guard let viewControllerIndex = VCArr.index(of: viewController) else {
return nil
}
let previousIndex = viewControllerIndex-1
guard previousIndex >= 0 else {
return nil
}
guard VCArr.count > previousIndex else {
return nil
}
return VCArr[previousIndex]
}
public func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController?{
guard let viewControllerIndex = VCArr.index(of: viewController) else {
return nil
}
let nextIndex = viewControllerIndex+1
guard nextIndex < VCArr.count
else {
return nil
}
guard VCArr.count > nextIndex else {
return nil
}
return VCArr[nextIndex]
}
public func presentationCount(for pageViewController: UIPageViewController) -> Int{
return VCArr.count
}
public func presentationIndex(for pageViewController: UIPageViewController) -> Int{
guard let firstViewController = viewControllers?.first , let firstViewControllerIndex = VCArr.index(of: firstViewController) else {
return 0
}
let firstIndex = firstViewControllerIndex - 1
guard firstIndex >= VCArr.count else {
return VCArr.count
}
return firstViewControllerIndex
}
public func pageViewController(_ pageViewController: UIPageViewController, didFinishAnimating finished: Bool, previousViewControllers: [UIViewController], transitionCompleted completed: Bool) {
self.pageVC.currentPage = pageViewController.viewControllers!.first!.view.tag
if(viewControllers!.first?.view.tag == 4 ) {
if (VCArr.last!.isViewLoaded)
{
let mainStoryboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
let viewController = mainStoryboard.instantiateViewController(withIdentifier: "FivethVC")
let appDelegate = UIApplication.shared.delegate as! AppDelegate
appDelegate.window?.rootViewController = viewController
print("Last Page Reached!!!")
}
}
}
}
Related
import SwiftUI
import UIKit
extension Color {
static var random: Color {
return Color (
red: .random(in: 0...1),
green: .random(in: 0...1),
blue: .random(in: 0...1)
)
}
}
struct ContentView: View {
let pages = (0..<3).map { _ in Color.random }
var body: some View {
PageView(pages: pages)
.ignoresSafeArea()
}
}
struct PageView<Page: View>: View {
var pages: [Page]
#State private var currentPage = 0
var body: some View {
PageViewController(pages: pages, currentPage: $currentPage)
}
}
struct PageViewController<Page: View>: UIViewControllerRepresentable {
var pages: [Page]
#Binding var currentPage: Int
func makeCoordinator() -> Coordinator {
Coordinator(self)
}
func makeUIViewController(context: Context) -> UIPageViewController {
let pageViewController = UIPageViewController(
transitionStyle: .scroll,
navigationOrientation: .horizontal)
pageViewController.dataSource = context.coordinator
pageViewController.delegate = context.coordinator
return pageViewController
}
func updateUIViewController(_ pageViewController: UIPageViewController, context: Context) {
pageViewController.setViewControllers(
[context.coordinator.controllers[currentPage]], direction: .forward, animated: true)
}
class Coordinator: NSObject, UIPageViewControllerDataSource, UIPageViewControllerDelegate {
var parent: PageViewController
var controllers = [UIViewController]()
init(_ pageViewController: PageViewController) {
parent = pageViewController
controllers = parent.pages.map { UIHostingController(rootView: $0) }
}
func pageViewController(
_ pageViewController: UIPageViewController,
viewControllerBefore viewController: UIViewController) -> UIViewController? {
guard let index = controllers.firstIndex(of: viewController) else {
return nil
}
if index == 0 {
return controllers.last
}
return controllers[index - 1]
}
func pageViewController(
_ pageViewController: UIPageViewController,
viewControllerAfter viewController: UIViewController) -> UIViewController? {
guard let index = controllers.firstIndex(of: viewController) else {
return nil
}
if index + 1 == controllers.count {
return controllers.first
}
return controllers[index + 1]
}
func pageViewController(
_ pageViewController: UIPageViewController,
didFinishAnimating finished: Bool,
previousViewControllers: [UIViewController],
transitionCompleted completed: Bool) {
if completed,
let visibleViewController = pageViewController.viewControllers?.first,
let index = controllers.firstIndex(of: visibleViewController) {
parent.currentPage = index
}
}
}
}
It should be not only for container, but for internal view as well (to fill that external container), because by default every view respects safe area.
So the fix is
init(_ pageViewController: PageViewController) {
parent = pageViewController
controllers = parent.pages.map {
UIHostingController(rootView: $0.ignoresSafeArea()) // << here !!
}
}
Tested with Xcode 13.3 / iOS 15.4
I am trying to get image from camera and show in imageview using swift 3.0 but it is showing white background only. Image is uploaded to my server successfully. On iPAD it is not even opening the camera app. below is my code: I am new to swift to please let me know what mistake i ma doing.
import UIKit
import Alamofire
import SwiftyJSON
import AlamofireImage
class RadiologyViewController:UIViewController,UIImagePickerControllerDelegate,UINavigationControllerDelegate,UITextViewDelegate{
#IBOutlet weak var indicator1: UIActivityIndicatorView!
#IBOutlet weak var name : UILabel!
#IBOutlet weak var mobile: UILabel!
#IBOutlet weak var gender: UILabel!
#IBOutlet weak var age : UILabel!
#IBOutlet weak var indicator4: UIActivityIndicatorView!
#IBOutlet weak var indicator3: UIActivityIndicatorView!
#IBOutlet weak var indicator2: UIActivityIndicatorView!
#IBOutlet weak var pic4text: UITextView!
#IBOutlet weak var pic3text: UITextView!
#IBOutlet weak var pic2text: UITextView!
#IBOutlet weak var pictext1: UITextView!
// WHICH SHOW BUTTON YOU WANT TO SHOW YOU HAVE TO CHANGE HEIGHT CONSTRAINT //
// conPic1height = conPic1height - 20 - UN HIDE BUTTON BY TAKING ITS OUTLET//
#IBOutlet weak var conPic1height: NSLayoutConstraint!
#IBOutlet weak var conPic2height: NSLayoutConstraint!
#IBOutlet weak var conPic3height: NSLayoutConstraint!
#IBOutlet weak var conPic4height: NSLayoutConstraint!
#IBOutlet weak var pic4: UIImageView!
#IBOutlet weak var pic3: UIImageView!
#IBOutlet weak var pic2: UIImageView!
#IBOutlet weak var pic1: UIImageView!
#IBOutlet weak var complain: UILabel!
#IBOutlet weak var explain : UILabel!
#IBOutlet weak var date : UILabel!
#IBOutlet weak var btnShowPic4: UIButton!
#IBOutlet weak var btnShowPic3: UIButton!
#IBOutlet weak var btnShowPic2: UIButton!
#IBOutlet weak var btnShowPic1: UIButton!
var patient : Patients? = nil;
var username : String? = nil;
var picNumber : Int = 0;
var pic1path : String = "";
var pic2path : String = "";
var pic3path : String = "";
var pic4path : String = "";
var strLabel = UILabel()
var indicator = UIActivityIndicatorView()
let effectView = UIVisualEffectView(effect: UIBlurEffect(style: .dark))
override func viewDidLoad() {
super.viewDidLoad()
self.navigationController?.isNavigationBarHidden = true
if patient != nil {
name.text = patient?.patientName;
age.text = "Age: "+(patient?.patientAge)!;
gender.text = "Gender: "+(patient?.patientGender)!;
mobile.text = "Mobile: "+(patient?.patientMobile)!;
date.text = "Date: "+(patient?.patientDate)!;
complain.text = "Complaint: " + "\(self.makeComplainText(complain: (patient?.patientComplaint)!))";
explain.text = "Explain: "+(patient?.patientExplainComplaint)!;
}
let defaults1 = UserDefaults.standard
let user = defaults1.object(forKey: "user") as? NSData
let responseData = NSKeyedUnarchiver.unarchiveObject(with: user! as Data) as? ResponseModel
if responseData != nil {
if responseData?.profile != nil {
username = responseData?.profile[0].userName;
}
}
pictext1.delegate = self
pic2text.delegate = self
pic3text.delegate = self
pic4text.delegate = self
pic1path = (patient?.patientPic1)!;
pic2path = (patient?.patientPic2)!;
pic3path = (patient?.patientPic3)!;
pic4path = (patient?.patientPic4)!;
pictext1.text = patient?.patientPictxt1;
pic2text.text = patient?.patientPictxt2;
pic3text.text = patient?.patientPictxt3;
pic4text.text = patient?.patientPictxt4;
let tapFirstGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(imageTapped1(_:)))
pic1.isUserInteractionEnabled = true
pic1.addGestureRecognizer(tapFirstGestureRecognizer)
let tapSecondGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(imageTapped2(_:)))
pic2.isUserInteractionEnabled = true
pic2.addGestureRecognizer(tapSecondGestureRecognizer)
let tapThirdGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(imageTapped3(_:)))
pic3.isUserInteractionEnabled = true
pic3.addGestureRecognizer(tapThirdGestureRecognizer)
let tapFourGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(imageTapped4(_:)))
pic4.isUserInteractionEnabled = true
pic4.addGestureRecognizer(tapFourGestureRecognizer)
if patient?.patientPic1 != "" {
pic1.image = nil;
setImage(imageview: pic1, url: (patient?.patientPic1)!,indicator:indicator1)
showFirstButton(show: false)
} else {
showFirstButton(show: true)
indicator1.isHidden = true
}
if patient?.patientPic2 != "" {
pic2.image = nil;
showSecondButton(show: false)
setImage(imageview: pic2, url: (patient?.patientPic2)!,indicator:indicator2)
} else {
showSecondButton(show: true)
indicator2.isHidden = true
}
if patient?.patientPic3 != "" {
pic3.image = nil;
showThreeButton(show: false)
setImage(imageview: pic3, url: (patient?.patientPic3)!,indicator:indicator3)
} else {
showThreeButton(show: true)
indicator3.isHidden = true
}
if patient?.patientPic4 != "" {
pic4.image = nil;
showFourButton(show: false)
setImage(imageview: pic4, url: (patient?.patientPic4)!,indicator:indicator4)
} else {
showFourButton(show: true)
indicator4.isHidden = true
}
let tapKeuboardDismissGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(dismissKeyboard(_:)))
view.isUserInteractionEnabled = true
view.addGestureRecognizer(tapKeuboardDismissGestureRecognizer)
// Do any additional setup after loading the view.
}
func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {
if text == "\n" // Recognizes enter key in keyboard
{
textView.resignFirstResponder()
return false
}
return true
}
func dismissKeyboard(_ sender: UITapGestureRecognizer) {
view.endEditing(true)
}
func imageTapped1(_ sender: UITapGestureRecognizer) {
if (sender.view as? UIImageView) != nil {
print("Image Tapped")
picNumber = 1;
showActionSheet()
}
}
func imageTapped2(_ sender: UITapGestureRecognizer) {
if (sender.view as? UIImageView) != nil {
print("Image Tapped")
picNumber = 2;
showActionSheet()
}
}
func imageTapped3(_ sender: UITapGestureRecognizer) {
if (sender.view as? UIImageView) != nil {
print("Image Tapped")
picNumber = 3;
showActionSheet()
}
}
func imageTapped4(_ sender: UITapGestureRecognizer) {
if (sender.view as? UIImageView) != nil {
print("Image Tapped")
picNumber = 4;
showActionSheet()
}
}
func camera()
{
let myPickerController = UIImagePickerController()
myPickerController.delegate = self;
myPickerController.allowsEditing = false
myPickerController.sourceType = UIImagePickerControllerSourceType.camera
myPickerController.cameraCaptureMode = .photo
myPickerController.modalPresentationStyle = .fullScreen
self.present(myPickerController, animated: true, completion: nil)
}
func photoLibrary()
{
let myPickerController = UIImagePickerController()
myPickerController.delegate = self;
myPickerController.sourceType = UIImagePickerControllerSourceType.photoLibrary
self.present(myPickerController, animated: true, completion: nil)
}
func showActionSheet() {
let actionSheet = UIAlertController(title: nil, message: nil, preferredStyle: UIAlertControllerStyle.actionSheet)
actionSheet.addAction(UIAlertAction(title: "Camera", style: UIAlertActionStyle.default, handler: { (alert:UIAlertAction!) -> Void in
self.camera()
}))
actionSheet.addAction(UIAlertAction(title: "Gallery", style: UIAlertActionStyle.default, handler: { (alert:UIAlertAction!) -> Void in
self.photoLibrary()
}))
actionSheet.addAction(UIAlertAction(title: "Cancel", style: UIAlertActionStyle.cancel, handler: nil))
// if (UIDevice.current.userInterfaceIdiom == .pad) {
// let popover = actionSheet.popoverPresentationController
// popover?.sourceRect = self.view.bounds
// popover?.sourceView = self.pic1
// popover?.permittedArrowDirections = .any
// self.present(actionSheet, animated: true, completion: nil)
// } else {
self.present(actionSheet, animated: true, completion: nil)
//}
}
#IBAction func btnpic3Click(_ sender: Any) {
var profileStoryBoard: UIStoryboard!
profileStoryBoard = UIStoryboard(name:"\(Helper.manageStoryBoardName())ShowImage",bundle: nil)
let viewcontroller : ImageShowViewController = profileStoryBoard.instantiateViewController(withIdentifier: "ImageShowViewController") as! ImageShowViewController
viewcontroller.url = pic3path
self.present(viewcontroller, animated: false)
}
#IBAction func btnpic4Click(_ sender: Any) {
var profileStoryBoard: UIStoryboard!
profileStoryBoard = UIStoryboard(name:"\(Helper.manageStoryBoardName())ShowImage",bundle: nil)
let viewcontroller : ImageShowViewController = profileStoryBoard.instantiateViewController(withIdentifier: "ImageShowViewController") as! ImageShowViewController
viewcontroller.url = pic4path
self.present(viewcontroller, animated: false)
}
#IBAction func btnpic1Click(_ sender: UIButton) {
var profileStoryBoard: UIStoryboard!
profileStoryBoard = UIStoryboard(name:"\(Helper.manageStoryBoardName())ShowImage",bundle: nil)
let viewcontroller : ImageShowViewController = profileStoryBoard.instantiateViewController(withIdentifier: "ImageShowViewController") as! ImageShowViewController
viewcontroller.url = pic1path
self.present(viewcontroller, animated: false)
}
#IBAction func btnpic2Click(_ sender: UIButton) {
var profileStoryBoard: UIStoryboard!
profileStoryBoard = UIStoryboard(name:"\(Helper.manageStoryBoardName())ShowImage",bundle: nil)
let viewcontroller : ImageShowViewController = profileStoryBoard.instantiateViewController(withIdentifier: "ImageShowViewController") as! ImageShowViewController
viewcontroller.url = pic2path
self.present(viewcontroller, animated: false)
}
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
if picNumber == 1 {
pic1.image = info[UIImagePickerControllerOriginalImage] as? UIImage
uploadImage(image: (info[UIImagePickerControllerOriginalImage] as? UIImage)!)
} else if picNumber == 2 {
pic2.image = info[UIImagePickerControllerOriginalImage] as? UIImage
uploadImage(image: (info[UIImagePickerControllerOriginalImage] as? UIImage)!)
} else if picNumber == 3 {
pic3.image = info[UIImagePickerControllerOriginalImage] as? UIImage
uploadImage(image: (info[UIImagePickerControllerOriginalImage] as? UIImage)!)
} else {
pic4.image = info[UIImagePickerControllerOriginalImage] as? UIImage
uploadImage(image: (info[UIImagePickerControllerOriginalImage] as? UIImage)!)
}
self.dismiss(animated: true, completion: nil)
}
func uploadImage(image:UIImage) -> Void {
if Reachability.isConnectedToNetwork() == true {
self.showLoading(title: "uploding image");
let imgData = UIImageJPEGRepresentation(image, 0.2)!
var path :String = "";
let parameters = ["username": username]
Alamofire.upload(multipartFormData: { multipartFormData in
multipartFormData.append(imgData, withName: "images",fileName: "file.jpg", mimeType: "image/jpg")
for (key, value) in parameters {
multipartFormData.append((value?.data(using: String.Encoding.utf8)!)!, withName: key)
}
},
to:"http://www.dentalsa.net/api/api.php?method=radiaolog_image_update")
{ (result) in
switch result {
case .success(let upload, _, _):
upload.responseJSON { response in
self.hideLoading()
let value = response.result.value
let jsonResponse = JSON(value)
let status = jsonResponse["status"].stringValue
let message = jsonResponse["message"].stringValue
if status == "false" {
self.showAlerError(titleText: "Error", messagetext: message);
}
path = jsonResponse["path"].stringValue
if self.picNumber == 1 {
self.pic1path = path
} else if self.picNumber == 2 {
self.pic2path = path
} else if self.picNumber == 3 {
self.pic3path = path
} else if self.picNumber == 4 {
self.pic4path = path
}
print("ImagePath"+path)
}
case .failure(let encodingError):
print(encodingError)
}
}
} else {
self.showAlerError(titleText: "Error", messagetext: "Please check Internet connectivity");
}
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
func makeComplainText(complain:String) -> String {
let characters = Array(complain.characters);
var data="";
if characters[0] == "1" {
data += "Check-Up, ";
}
if characters[1] == "1" {
data += "Teeth Cleaning, ";
}
if characters[2] == "1" {
data += "Periodontal Treatment, ";
}
if characters[3] == "1" {
data += "Dental Fillings, ";
}
if characters[4] == "1" {
data += "Prothesis, ";
}
if characters[5] == "1" {
data += "Extraction, ";
}
if characters[6] == "1" {
data += "Hollywoods smile, ";
}
if characters[7] == "1" {
data += "Children's Teeth, ";
}
if characters[8] == "1" {
data += "Bleaching, ";
}
return data;
}
#IBAction func saveClick(_ sender: UIButton) {
let netowrk = NetworkCall();
if Reachability.isConnectedToNetwork() == true {
self.showLoading(title: "Please wait")
netowrk.radiologyUpdate(username: username!,patientId: (patient?.patientID)!,picText1: pictext1.text!,picText2: pic2text.text!,picText3: pic3text.text!,picText4: pic4text.text!,pic1:pic1path,pic2:pic2path,pic3:pic3path,pic4:pic4path) { responseObject in
self.hideLoading()
if responseObject.status == "true" {
print("Success view controller");
self.showAlerError(titleText: "Success", messagetext: "Details saved Successfully");
} else {
self.showAlerError(titleText: "Error", messagetext: responseObject.message!);
}
return
}
} else {
self.showAlerError(titleText: "Error", messagetext: "Please check Internet connectivity");
}
}
func showLoading(title: String) {
strLabel.removeFromSuperview()
indicator.removeFromSuperview()
effectView.removeFromSuperview()
strLabel = UILabel(frame: CGRect(x: 50, y: 0, width: 160, height: 46))
strLabel.text = title
strLabel.font = UIFont.systemFont(ofSize: 14, weight: UIFontWeightMedium)
strLabel.textColor = UIColor(white: 0.9, alpha: 0.7)
effectView.frame = CGRect(x: view.frame.midX - strLabel.frame.width/2, y: view.frame.midY - strLabel.frame.height/2 , width: 160, height: 46)
effectView.layer.cornerRadius = 15
effectView.layer.masksToBounds = true
indicator = UIActivityIndicatorView(activityIndicatorStyle: .white)
indicator.frame = CGRect(x: 0, y: 0, width: 46, height: 46)
indicator.startAnimating()
effectView.addSubview(indicator)
effectView.addSubview(strLabel)
view.addSubview(effectView)
}
func setImage(imageview :UIImageView,url:String,indicator:UIActivityIndicatorView) -> Void {
Alamofire.request("http://www.dentalsa.net"+url).responseImage { response in
if let image = response.result.value {
indicator.isHidden = true
imageview.image = image
}
}
}
func hideLoading() {
self.effectView.removeFromSuperview()
//indicator.stopAnimating()
}
func showAlerError(titleText:String,messagetext:String) {
let alertController = UIAlertController(title: titleText, message:
messagetext, preferredStyle: UIAlertControllerStyle.alert)
alertController.addAction(UIAlertAction(title: "Dismiss", style: UIAlertActionStyle.default,handler: nil))
self.present(alertController, animated: true, completion: nil)
}
#IBAction func backClick(_ sender: UIButton) {
_ = self.navigationController?.popViewController(animated: true)
}
func showFirstButton(show :Bool){
//conPic1height.constant = 150
btnShowPic1.isHidden = show
self.view.layoutIfNeeded()
}
func showSecondButton(show :Bool){
//conPic1height.constant = 150
btnShowPic2.isHidden = show
self.view.layoutIfNeeded()
}
func showThreeButton(show :Bool){
//conPic1height.constant = 150
btnShowPic3.isHidden = show
self.view.layoutIfNeeded()
}
func showFourButton(show :Bool){
//conPic1height.constant = 150
btnShowPic4.isHidden = show
self.view.layoutIfNeeded()
}
/*
// MARK: - Navigation
// In a storyboard-based application, you will often want to do a little preparation before navigation
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
// Get the new view controller using segue.destinationViewController.
// Pass the selected object to the new view controller.
}
*/
}
I need to capture image from camera and gallery on both iphone and iPad. I don't know what is the issue which i am facing here.
As per the title, in general I'd like to show, in one VC, a MapView and in a second VC a SearchBar (using another TableVC to display, as the user types, "GeoElements" obtained by MKLocalSearchRequest). This because I want to display in the Map some AnnotationViews with custom Callouts. My problem is that the TableVC doesn't update with placemarks as the user types in the SearchBar..
MAPVIEW code:
import UIKit
import MapKit
protocol HandleMapSearch {
func dropPinZoomIn(placemark:MKPlacemark)
}
class ViewController: UIViewController {
#IBOutlet weak var mapView: MKMapView!
let locationManager = CLLocationManager()
var selectedPin:MKPlacemark? = nil
override func viewDidLoad() {
super.viewDidLoad()
locationManager.delegate = self
locationManager.desiredAccuracy = kCLLocationAccuracyThreeKilometers
locationManager.requestWhenInUseAuthorization()
locationManager.requestLocation()
}
func getDirections(){
if let selectedPin = selectedPin {
let mapItem = MKMapItem(placemark: selectedPin)
let launchOptions = [MKLaunchOptionsDirectionsModeKey : MKLaunchOptionsDirectionsModeDriving]
mapItem.openInMaps(launchOptions: launchOptions)
}
}
}
extension ViewController : CLLocationManagerDelegate {
private func locationManager(manager: CLLocationManager, didChangeAuthorizationStatus status: CLAuthorizationStatus) {
if status == .authorizedWhenInUse {
locationManager.requestLocation()
}
}
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
if let location = locations.first {
let span = MKCoordinateSpanMake(0.05, 0.05)
let region = MKCoordinateRegion(center: location.coordinate, span: span)
mapView.setRegion(region, animated: true)
}
}
func locationManager(_ manager: CLLocationManager, didFailWithError error: Error) {
print("error:: (error)")
}
}
extension ViewController: HandleMapSearch {
func dropPinZoomIn(placemark:MKPlacemark){
// cache the pin
selectedPin = placemark
let annotation = MKPointAnnotation()
annotation.coordinate = placemark.coordinate
annotation.title = placemark.name
if let city = placemark.locality,
let state = placemark.administrativeArea {
annotation.subtitle = "(city) (state)"
}
mapView.addAnnotation(annotation)
let span = MKCoordinateSpanMake(0.05, 0.05)
let region = MKCoordinateRegionMake(placemark.coordinate, span)
mapView.setRegion(region, animated: true)
}
}
extension ViewController : MKMapViewDelegate {
func mapView(_: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView?{
if annotation is MKUserLocation {
//return nil so map view draws "blue dot" for standard user location
return nil
}
let reuseId = "pin"
var pinView = mapView.dequeueReusableAnnotationView(withIdentifier: reuseId) as? MKPinAnnotationView
pinView = MKPinAnnotationView(annotation: annotation, reuseIdentifier: reuseId)
pinView?.pinTintColor = UIColor.orange
pinView?.canShowCallout = true
let smallSquare = CGSize(width: 30, height: 30)
let button = UIButton(frame: CGRect(origin: CGPoint(x: 0,y :0), size: smallSquare))
button.setBackgroundImage(UIImage(named: "car"), for: .normal)
button.addTarget(self, action: Selector(("getDirections")), for: .touchUpInside)
pinView?.leftCalloutAccessoryView = button
return pinView
}
}
EVENT code:
import UIKit
import MapKit
class EventVC: UIViewController {
var resultSearchController:UISearchController? = nil
override func viewDidLoad() {
super.viewDidLoad()
let locationSearchTable = storyboard!.instantiateViewController(withIdentifier: "LocationSearchTable") as! LocationSearchTable
resultSearchController = UISearchController(searchResultsController: locationSearchTable)
resultSearchController?.searchResultsUpdater = locationSearchTable
let searchBar = resultSearchController!.searchBar
searchBar.sizeToFit()
searchBar.placeholder = "Insert Address"
navigationItem.titleView = resultSearchController?.searchBar
resultSearchController?.hidesNavigationBarDuringPresentation = false
resultSearchController?.dimsBackgroundDuringPresentation = true
definesPresentationContext = true
//these two below are problematic
locationSearchTable.mapView = mapView
locationSearchTable.handleMapSearchDelegate = self
}
}
LOCATIONSEARCHTABLE code:
import UIKit
import MapKit
class LocationSearchTable: UITableViewController {
var matchingItems:[MKMapItem] = []
var mapView: MKMapView? = nil
var handleMapSearchDelegate:HandleMapSearch? = nil
override func viewDidLoad() {
super.viewDidLoad()
}
func parseAddress(selectedItem:MKPlacemark) -> String {
// put a space between "4" and "Melrose Place"
let firstSpace = (selectedItem.subThoroughfare != nil && selectedItem.thoroughfare != nil) ? " " : ""
// put a comma between street and city/state
let comma = (selectedItem.subThoroughfare != nil || selectedItem.thoroughfare != nil) && (selectedItem.subAdministrativeArea != nil || selectedItem.administrativeArea != nil) ? ", " : ""
// put a space between "Washington" and "DC"
let secondSpace = (selectedItem.subAdministrativeArea != nil && selectedItem.administrativeArea != nil) ? " " : ""
let addressLine = String(
format:"%#%#%#%#%#%#%#",
// street number
selectedItem.subThoroughfare ?? "",
firstSpace,
// street name
selectedItem.thoroughfare ?? "",
comma,
// city
selectedItem.locality ?? "",
secondSpace,
// state
selectedItem.administrativeArea ?? ""
)
return addressLine
}
}
extension LocationSearchTable : UISearchResultsUpdating {
func updateSearchResults(for searchController: UISearchController){
guard let mapView = mapView,
let searchBarText = searchController.searchBar.text else { return }
let request = MKLocalSearchRequest()
request.naturalLanguageQuery = searchBarText
request.region = mapView.region
let search = MKLocalSearch(request: request)
search.start { response, _ in
guard let response = response else {
return
}
self.matchingItems = response.mapItems
self.tableView.reloadData()
}
}
}
extension LocationSearchTable {
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return matchingItems.count
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "cell")!
let selectedItem = matchingItems[indexPath.row].placemark
cell.textLabel?.text = selectedItem.name
cell.detailTextLabel?.text = parseAddress(selectedItem: selectedItem)
return cell
}
}
So I am new to iOS development. I am trying to make a page swipe functionality like an image carousel or like an app tutorial, and I'm Running into a Thread 1: signal SIGABRT error. in the log is states 'Can not cast value of type 'ViewController' to 'UIPageViewController'
not sure you need the entire code.
my problem line is:
self.pageViewController = self.storyboard?.instantiateViewController(withIdentifier: "contentViewController") as! UIPageViewController
help will be greatly appreciated.
class ViewController: UIViewController, UIPageViewControllerDataSource {
var pageViewController: UIPageViewController!
var pageTitles: NSArray!
var pageImages: NSArray!
override func viewDidLoad() {
self.pageTitles = NSArray(objects: " By Request","Subscription Plan","Flex Plan","Everyday Plan", "Welocme")
self.pageImages = NSArray(objects: "page1","page2","page3","page4","page5")
self.pageViewController = self.storyboard?.instantiateViewController(withIdentifier: "contentViewController") as! UIPageViewController
self.pageViewController.dataSource = self
let startVC = self.viewControllerAtIndex(index: 0) as ContentViewController
let viewControllers = NSArray(object: startVC)
self.pageViewController.setViewControllers(viewControllers as? [UIViewController], direction: .forward, animated: true, completion: nil)
self.pageViewController.view.frame = CGRect(x: 0, y:0, width: Int(self.view.frame.width), height: Int(self.view.frame.size.height - 60))
self.addChildViewController(self.pageViewController)
self.view.addSubview(self.pageViewController.view)
self.pageViewController.didMove(toParentViewController: self)
super.viewDidLoad()
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
#IBAction func loginAction(_ sender: AnyObject) {
}
#IBAction func signupAction(_ sender: AnyObject) {
}
func viewControllerAtIndex(index: Int) -> ContentViewController {
if ((self.pageTitles.count == 0) || (index >= self.pageTitles.count)) {
return ContentViewController()
}
var vc: ContentViewController = self.storyboard?.instantiateViewController(withIdentifier: "pageViewController") as! ContentViewController
vc.imageFile = self.pageImages[index] as! String
vc.titleText = self.pageTitles[index] as! String
vc.pageIndex = index
return vc
}
// MARK: - Page Vuew Controller Data Source
func pageViewController(_ pageViewController: UIPageViewController, viewControllerBefore viewController: UIViewController) -> UIViewController? {
let vc = viewController as! ContentViewController
var index = vc.pageIndex as Int
if ((index == 0) || (index == NSNotFound)) {
return nil
}
index -= 1
return self.viewControllerAtIndex(index: index)
}
func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController? {
var vc = viewController as! ContentViewController
var index = vc.pageIndex as Int
if (index == NSNotFound) {
return nil
}
index += 1
if (index == self.pageTitles.count) {
return nil
}
return self.viewControllerAtIndex(index: index)
}
func presentationCount(for pageViewController: UIPageViewController) -> Int {
return self.pageTitles.count
}
func presentationIndex(for pageViewController: UIPageViewController) -> Int {
return 0
}
}
I am having difficulties converting two sections of code from Swift 2 to Swift 3
The working Swift 2 Code Block was
func showRoute(routes: [MKRoute], time: NSTimeInterval) {
var directionsArray = [(startingAddress: String, endingAddress: String, route: MKRoute)]()
for i in 0..<routes.count {
plotPolyline(routes[i])
directionsArray += [(locationArray[i].textField.text!,
locationArray[i+1].textField.text!, routes[i])]
}
displayDirections(directionsArray)
printTimeToLabel(time)
}
Swift 3 has converted this to
func showRoute(routes: [MKRoute], time: TimeInterval) {
var directionsArray = [(startingAddress: String, endingAddress: String, route: MKRoute)]()
for i in 0..<routes.count {
plotPolyline(route: routes[i])
directionsArray += [(locationArray[i].textField?.text,
locationArray[i+1].textField?.text, routes[i])]
}
displayDirections(directionsArray: directionsArray)
printTimeToLabel(time: time)
}
This produces an error on the line
directionsArray += [(locationArray[i].textField?.text,
locationArray[i+1].textField?.text, routes[i])]
Cannot convert value of type '[(startingAddress: String, endingAddress: String, route: MKRoute)]' to expected argument type 'inout _'
If anyone can help i would really appreciate it
Just need
directionsArray += [(startingAddress : locationArray[i].textField!.text!,
endingAddress : locationArray[i+1].textField!.text!,
route : routes[i])]
I saw your question, but There are no answers. And, That is not only one problem.
Here is full body of ViewController:
import UIKit
import MapKit
import CoreLocation
class ViewController: UIViewController {
#IBOutlet weak var sourceField: UITextField!
#IBOutlet weak var destinationField1: UITextField!
#IBOutlet weak var destinationField2: UITextField!
#IBOutlet weak var topMarginConstraint: NSLayoutConstraint!
#IBOutlet var enterButtonArray: [UIButton]!
var originalTopMargin: CGFloat!
let locationManager = CLLocationManager()
var locationTuples: [(textField: UITextField?, mapItem: MKMapItem?)]!
var locationsArray: [(textField: UITextField?, mapItem: MKMapItem?)] {
var filtered = locationTuples.filter({ $0.mapItem != nil })
filtered += [filtered.first!]
return filtered
}
override func viewDidLoad() {
super.viewDidLoad()
originalTopMargin = topMarginConstraint.constant
locationTuples = [(sourceField, nil), (destinationField1, nil), (destinationField2, nil)]
locationManager.delegate = self
locationManager.requestWhenInUseAuthorization()
if CLLocationManager.locationServicesEnabled() {
locationManager.desiredAccuracy = kCLLocationAccuracyHundredMeters
locationManager.requestLocation()
}
}
override func viewWillAppear(_ animated: Bool) {
navigationController?.isNavigationBarHidden = true
}
#IBAction func getDirections(_ sender: AnyObject) {
view.endEditing(true)
performSegue(withIdentifier: "show_directions", sender: self)
}
override func shouldPerformSegue(withIdentifier identifier: String, sender: Any?) -> Bool {
if locationTuples[0].mapItem == nil ||
(locationTuples[1].mapItem == nil && locationTuples[2].mapItem == nil) {
showAlert("Please enter a valid starting point and at least one destination.")
return false
} else {
return true
}
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
let directionsViewController = segue.destination as! DirectionsViewController
directionsViewController.locationArray = locationsArray
}
#IBAction func addressEntered(_ sender: UIButton) {
view.endEditing(true)
let currentTextField = locationTuples[sender.tag-1].textField
CLGeocoder().geocodeAddressString(currentTextField!.text!,
completionHandler: {(placemarks, error) -> Void in
if let placemarks = placemarks {
var addresses = [String]()
for placemark in placemarks {
addresses.append(self.formatAddressFromPlacemark(placemark))
}
self.showAddressTable(addresses, textField:currentTextField!,
placemarks:placemarks, sender:sender)
} else {
self.showAlert("Address not found.")
}
} )
}
func showAddressTable(_ addresses: [String], textField: UITextField,
placemarks: [CLPlacemark], sender: UIButton) {
let addressTableView = AddressTableView(frame: UIScreen.main.bounds, style: UITableViewStyle.plain)
addressTableView.addresses = addresses
addressTableView.currentTextField = textField
addressTableView.placemarkArray = placemarks
addressTableView.mainViewController = self
addressTableView.sender = sender
addressTableView.delegate = addressTableView
addressTableView.dataSource = addressTableView
view.addSubview(addressTableView)
}
func formatAddressFromPlacemark(_ placemark: CLPlacemark) -> String {
return (placemark.addressDictionary!["FormattedAddressLines"] as! [String]).joined(separator: ", ")
}
#IBAction func swapFields(_ sender: AnyObject) {
swap(&destinationField1.text, &destinationField2.text)
swap(&locationTuples[1].mapItem, &locationTuples[2].mapItem)
swap(&self.enterButtonArray.filter{$0.tag == 2}.first!.isSelected, &self.enterButtonArray.filter{$0.tag == 3}.first!.isSelected)
}
func showAlert(_ alertString: String) {
let alert = UIAlertController(title: nil, message: alertString, preferredStyle: .alert)
let okButton = UIAlertAction(title: "OK",
style: .cancel) { (alert) -> Void in
}
alert.addAction(okButton)
present(alert, animated: true, completion: nil)
}
// The remaining methods handle the keyboard resignation/
// move the view so that the first responders aren't hidden
func moveViewUp() {
if topMarginConstraint.constant != originalTopMargin {
return
}
topMarginConstraint.constant -= 165
UIView.animate(withDuration: 0.3, animations: { () -> Void in
self.view.layoutIfNeeded()
})
}
func moveViewDown() {
if topMarginConstraint.constant == originalTopMargin {
return
}
topMarginConstraint.constant = originalTopMargin
UIView.animate(withDuration: 0.3, animations: { () -> Void in
self.view.layoutIfNeeded()
})
}
}
extension ViewController: UITextFieldDelegate {
func textField(_ textField: UITextField,
shouldChangeCharactersIn range: NSRange,
replacementString string: String) -> Bool {
enterButtonArray.filter{$0.tag == textField.tag}.first!.isSelected = false
locationTuples[textField.tag-1].mapItem = nil
return true
}
func textFieldDidBeginEditing(_ textField: UITextField) {
moveViewUp()
}
func textFieldDidEndEditing(_ textField: UITextField) {
moveViewDown()
}
func textFieldShouldReturn(_ textField: UITextField) -> Bool {
view.endEditing(true)
moveViewDown()
return true
}
}
extension ViewController: CLLocationManagerDelegate {
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
CLGeocoder().reverseGeocodeLocation(locations.last!,
completionHandler: {(placemarks, error) -> Void in
if let placemarks = placemarks {
let placemark = placemarks[0]
self.locationTuples[0].mapItem = MKMapItem(placemark:
MKPlacemark(coordinate: placemark.location!.coordinate,
addressDictionary: placemark.addressDictionary as! [String:AnyObject]?))
self.sourceField.text = self.formatAddressFromPlacemark(placemark)
self.enterButtonArray.filter{$0.tag == 1}.first!.isSelected = true
}
})
}
func locationManager(_ manager: CLLocationManager, didFailWithError error: Error) {
print(error)
}
}